持続可能な最大01trie同様のアイデアの会長が、木は貧しいバージョンとして使用されていないだけで、左にポイントを維持する必要があります
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define担当者(I、B)(I =(A)がINT;方には<=(B); iが++) の#define repp(I、B)(I =(A)がINTのために、I> = (B); - I) の#defineは長い長いっ の#defineは(X)(CERR <<(#X)<< '=' <<(X)<< ENDL)を参照 の#define INF 0x3f3f3f3f の#define CLR( 、V)のmemset(A、V、はsizeof A) ///////////////////////////////// / CONST INT N = 2E6 + 10 。 int型 T [Nが<< 5 ] [ 2 ]、Lmaxの[N << 5 ]、NCNT、N、M、X、Y、Z、T [N]、S [N]。 チャー SS [ 2 ]。 アップノード(int型 K、int型 I、INTプリ、int型のPOS) { もし(K < 0){Lmaxの[POS] = I。返す;} ブール C =(S [I] >> K)&1 。 もし(PRE)T [POS] [C ^ 1 ] = tの[事前] [C ^ 1 ]。 T [POS] [C] = ++ NCNT。 アップノード(k - 1 、I、T [事前] [C]、T [POS] [C])。 LMAX [POS] = MAX(LMAX [T [POS] [ 0 ]、LMAX [T [POS] [ 1 ])。 } INT Qmaxの(INT K、INTヴァル、int型の L、int型のPOS) { もし(K < 0)戻りヴァル^ S [Lmaxの[POS]。 ブール C =(ヴァル>> K)&1 。 もし(Lmaxと[T [POS] [C ^ 1 ]]> = 1)戻り Qmaxの(K- 1、ヴァル、L、T [POS] [C ^ 1 ])。 他 戻り Qmaxの(K- 1 、ヴァル、L、T [POS] [C])。 } int型のmain() { scanf関数(" %D%dの"、&N、&M); Lmaxを[ 0 ] = - 1 。 T [ 0] = ++ NCNT、アップノード(23、0、0、T [ 0 ])。 担当者(I、1 、N) { int型のX; scanf関数(" %のD "、&x)は、 S [i]は = sの[I- 1 ] ^ X。 T [I] = ++ NCNT。 アップノード(23、I、T [I- 1 ]、T [I])。 } int型のL、R。 一方、(M-- ) { scanf関数(" %sの" 、SS)。 もし(SS [ 0] == ' A ' ) { int型のX; scanf関数(" %のD "、&x)は、N ++; S [N] = sで[N- 1 ] ^ X。 T [N] = ++ NCNT、アップノード(23、N、T [N- 1 ]、T [N])。 } 他 { scanf関数(" %D%D%D "、&L&R&X)。 INTヴァル= X ^ S [N]。 printf(" %d個の\ n "、Qmaxと(23、ヴァル、1- 1、T [R- 1 ]))。 } } リターン 0 ; }