Смысл проблем: 1. конец последовательности необходимых операций ADDEND 2. XOR максимальный интервал.
Искомый максимальное значение исключающего ИЛИ секции легко думать, делать линейную группу
Когда контрольный матч блок-сегмент дерева и поддерживать линейную группу, результаты ОДВТ
Перед также, чтобы поддерживать суффикс линейной базы, но не знает, как бороться с интервалом, не думает, что положение линейного появления ухода Джил Вого
Положительное решением должно быть, чтобы поддерживать линейную базу для каждого суффикса, каждый из вставных элементов, когда они местоположение правильного число появляется в самом высоком выборе, при запросе, пока текущая позиция представляется до сих пор в правой л от имени интервала может генерировать этот номер
#include <карта> #include < набор > #include <CTime> #include <CMATH> #include <очереди> #include <стек> #include <вектор> #include < строка > #include <BitSet> #include <cstdio> # include <cstdlib> #include <CString> #include <sstream> #include <iostream> #include <алгоритм> #include <функциональный> используя пространство имен станд; #defineДля получения (I, х, у) для (INT I = х; г <= у; я ++) #define _for (I, х, у) , для (INT I = х; I> = у; i--) #define Mem (е, х) MemSet (е, х, SizeOf (е)) #define Sca (х) зсапЕ ( "% d", & х) #define SCA2 (х, у) зсапЕ ( "% d% d", & х , & у) #define Sca3 (х, у, г) зсапЕ ( "% d% d% d", & х, & у, & г) #define SCL (х) Scanf ( "% LLD", & х) #define Pri (х ) Е ( "% d \ п", х) #define Prl (х) Е ( "% LLD \ п", х) #define CLR (и) для (INT I = 0; г <= N; я ++) у [I] .clear (); #define LL долго долго #define ULL неподписанный долго долго #define тр make_pair #define PII пара <Int, Int> #define PIL пары <Int, длинный длинный> #define ФАПЧ пар <долго долго, долго долго> #define пб push_back #define фи первый #define себе второй ЬурейиЙ вектор < INT > VI; INT чтения () { INT х = 0 , е = 1 ; символ с = GetChar (); в то время как (с < ' 0 ' || с> ' 9 ' ) { если (с == ' - ' ) F = - 1 ; с = GetChar ();} в то время(с> = ' 0 ' && C <= ' 9 ' ) {х = х * 10 + с - ' 0 ' ; с = GetChar ();} возвращение х * е;} Const двойной PI = экоса (- 1,0 ); константный двойной EPS = 1e- 9 ; Const INT maxn = 1E6 + 10 ; Const ИНТ INF = 0x3f3f3f3f ; Const INT мод = 1e9 + 7 ; INT N, M, K; структура XJ { INTа [ 32 ], пос [ 32 ]; рядный недействительными инициализации () { для ( INT I = 0 ; г <= 30 ; я ++) в [I] = поз [I] = 0 ; } Рядный аннулируются добавить ( INT х, ИНТ р) { для ( INT I = 30 ; я> = 0 ; я - ) { если ((х & (! 1 << я))) по- прежнему ; если (! а [я]) { а [я]= Х; поз [I] = р; перерыв ; } Иначе { если (р> поз [I]) подкачки (а [I], х), своп (р, поз [I]); х ^ = а [I]; } } } Инлайн INT getmax ( INT л) { INT ANS = 0 ; для ( INT I = 30 ; я> = 0 ; я - ) { если (поз [I] <л) продолжить ; если(ANS <(ANS ^ а [я])) ANS ^ = а [I]; } Возврата ANS; } } Предварительно [maxn]; INT основных () { INT Т; Sca (Т); в то время как (T-- ) { SCA2 (N, M); для ( INT I = 1 ; г <= N; я ++ ) { Int х = чтения (); предварительно [I] = предварительно [я - 1 ]; предварительно [I] .add (х, I); } INT ANS = 0 ; в то время как (M-- ) { INT оп =читать(); если (! оп) { INT л = следующим образом () ^ ANS, г = READ () ^ анс; л = л% N + 1 ; г = г% N + 1 ; если (л> г) замены (L, R); ANS = предварительно [г] .getmax (л); Pri (ANS); } Иначе { INT х = READ () ^ анс; N ++ ; предварительно [N] = предварительно [N - 1 ]; предварительно [N] .add (х, Н); } } } Возвращают 0 ; }