sclass OptimizedMultiSet {
new Map map;
new MultiSetMap byCount;
int size;
int add(A a) {
size++;
Int i = map.get(key), count;
if (i != null)
byCount.remove(i++, a);
else
i = 1;
map.put(key, i);
byCount.add(i, a);
ret i;
}
void remove(A a) {
Int i = map.get(key);
if (i != null) {
--size;
byCount.remove(i, a);
if (--i > 0) {
map.put(key, i);
byCount.add(i, a);
} else
map.remove(key);
}
}
}