Editorial for Xort


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence.

Author: TadijaSebez

Napravimo segmentno stablo nad intervalom [0, 2^{20}). Za svaki segment [L, R) zapamtimo koliko brojeva iz početnog niza A su između L i R (odnosno broj indeksa i za koje važi L \leq A_i < R). Nazovimo to veličinom podstabala. Kako je operacija xor asocijativna pamtićemo xor svih X za xort operacije do sada u promenljivoj Y. Posle prve xort operacije get upite rešavamo pomoću segmentnog stabla (pre prve xort operacije samo ispisujemo A_K). Započinjemo rekurziju na korenu stabla i pamtimo pomoćnu promenljivu nivo koja je na početku jednaka 19. Ako Y ima cifru 1 u binarnom sistemu na mestu nivo-a (na početku gledamo devetnaesto mesto) to znači da su u desnom podstablu manji brojevi nego u levom. U suprotnom su manji brojevi u levom podstablu. Zapamtimo u kom podstablu su manji brojevi. Ako je veličina tog podstabla veća ili jednaka K rešenje nastavljamo da tražimo upravo u tom podstablu i smanjujemo nivo za 1. U suprotnom na rešenje dodajemo 2^{nivo}, smanjujemo K za veličinu podstabla sa manjim brojevima, smanjujemo nivo za 1 i nastavljamo pretragu u drugom podstablu. Kada stignemo do lista prekidamo proces i ispisujemo rešenje.

Sa M označimo maksimalnu moguću vrednost u nizu A u nekom trenutku. Vremenska složenost je O((N+Q)logM).


Comments

There are no comments at the moment.