Торговцы

Автор задачи и разработчик: Егор Юлин

Для решения данной задачи будем использовать дерево отрезком с отложенными операциями. Тогда первый и третий запрос — это стандартные запросы в дерево отрезков на изменение одного элемента и вычисление суммы на отрезке. Покажем, как можно выразить второй запрос.

Рассмотрим число $$$x$$$, которое меньше $$$2^k$$$, и запишем инвертированный $$$x$$$ как $$$\overline{x}$$$. Тогда $$$x \,\&\, \overline{x} = 0$$$. А тогда $$$x \oplus \overline{x} = x + \overline{x} = 2^k - 1$$$. Отсюда можно получить, что $$$\overline{x} = 2^k-1 - x$$$. Такое изменение несложно поддерживается на отрезке, если его разложить в

  1. умножение на отрезке на $$$-1$$$ (храним отложенный флаг, а сумму просто умножаем на $$$-1$$$);
  2. прибавление $$$2^k - 1$$$ на отрезке (стандартное действие, также храним отложенную операцию, а сумму пересчитываем, прибавляя эту величину, умноженную на длину отрезка).