Tree queries#236

Tree queries (Editorial)

Спершу спростимо вплив одного запиту на вартість дерева.

Запит додає (за XOR) до всіх вершин піддерева . Вартість дерева — це XOR усіх значень, тому в неї це увійде рівно стільки разів, скільки вершин у піддереві. Але x \oplus x = 0, отже важлива лише парність розміру піддерева:

  • якщо парний, запит взагалі не змінює вартість;

  • якщо непарний, вартість змінюється на .

Позначимо — XOR усіх початкових значень a_u, і назвемо запит суттєвим, якщо розмір його піддерева непарний. Тоді для будь-якої підмножини запитів вартість дорівнює

A \oplus \bigoplus_{j \in S,\ j \text{ суттєвий}} x_j.

Тепер порахуємо суму по всіх 2^q підмножинах побітово. Зафіксуємо біт і подивимось, у скількох підмножинах він дорівнює одиниці.

  • Якщо жоден суттєвий запит не має біта , то цей біт результату завжди дорівнює біту числа . Отже, він одиничний або в усіх 2^q підмножинах, або в жодній.

  • Якщо ж хоча б один суттєвий запит має біт , то рівно половина підмножин дає одиницю. Це видно з простої бієкції: зафіксуємо один такий запит і зіставимо кожній підмножині ту, що відрізняється лише його наявністю — це розбиває всі підмножини на пари з протилежними значеннями біта. Отже, рівно 2^{q-1} підмножин.

Тому відповідь дорівнює

\sum_{b} 2^b \cdot \begin{cases} 2^{q-1}, & \text{якщо якийсь суттєвий } x_j \text{ має біт } b;\\ 2^q, & \text{інакше і біт } b \text{ числа } A \text{ одиничний};\\ 0, & \text{інакше,} \end{cases}

усе за модулем .

Розміри піддерев (точніше, їхні парності) рахуються одним обходом у глибину. Значення сягають 2^{60}, тому перебирайте біти до -го включно і не забувайте, що степені двійки в сумі теж треба брати за модулем.