Контест Middle Move-семантика обновлено

Перенос между складами: map::extract без копий

Условие

Два склада хранят остатки как std::map<std::string, long long>: название товара и количество. Сначала все поступления идут на склад A. Затем приходят команды:

  • transfer name: перенести позицию name целиком со склада A на склад B (если на B такая позиция уже есть, количества складываются, иначе узел просто переезжает); если на A позиции нет, выведите missing name;
  • add name c: добавить c единиц товара на склад A.

В конце выведите A <число позиций>, затем позиции A по возрастанию названий, затем так же для B.

Подсказка: в C++17 map::extract вынимает узел вместе с ключом и значением без копирования, а insert(std::move(node)) вставляет его в другой map без новой аллокации.

Ввод: n (1 ≤ n ≤ 1500), n строк name c, затем m (1 ≤ m ≤ 1500) и m команд. 1 ≤ c ≤ 1000, названия из строчных латинских букв и цифр, до 20 символов.

Вывод: строки missing ... по ходу команд, затем итог складов.

Пример 1

Ввод:

3
glue 5
nail 10
glue 2
4
transfer glue
add glue 4
transfer glue
transfer saw

Вывод:

missing saw
A 1
nail 10
B 1
glue 11

Пример 2

Ввод:

1
x 1
1
transfer x

Вывод:

A 0
B 1
x 1

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.