sclass LineComp_LinkedList { sclass Node { int value; Node prev, next; } Node tail; new MultiSetMap indexByElement; *() {} *(L l) { fOr (int i : l) add(i); } void add(int i) { new Node n; n.value = i; n.prev = tail; if (tail != null) tail.next = n; tail = n; indexByElement.put(i, n); } void replacePair(int pa, int pb, int replaceWith, LineComp_PairCounts pairCounts) { Set setA = indexByElement.get(pa); if (setA != null) for (Node node : cloneList(setA)) { continue if node.value < 0; Node nb = node.next; if (nb != null && nb.value == pb) { if (node.prev != null) pairCounts.remove(node.prev.value, pa); pairCounts.remove(pa, pb); if (nb.next != null) pairCounts.remove(pb, nb.next.value); indexByElement.remove(pa, node); node.value = replaceWith; indexByElement.add(replaceWith, node); // delete nb indexByElement.remove(pb, nb); if (nb.next != null) nb.next.prev = node; node.next = nb.next; nb.value = -1; // mark invalid if (node.prev != null) pairCounts.add(node.prev.value, replaceWith); if (node.next != null) pairCounts.add(replaceWith, node.next.value); } } } L toList() { new L l; Node node = tail; while (node != null) { l.add(node.value); node = node.next; } ret reverseInPlace(l); } }