http://acm.hdu.edu.cn/showproblem.php?pid=6579
リニアイルhttps://blog.csdn.net/a_forever_dream/article/details/83654397
テンプレートhttps://blog.csdn.net/u013534123/article/details/79875825
我々は、各位置での線ベースの現在位置を考慮すべき最初の位置を得ます。私たちは、できるだけ多くのことで、選択したグループの対数線形高次の位置を確認します。だから細かい位置情報を維持しながら、私たちは、リニア基盤を維持する場合。
書式#include <CStringの> の#include <アルゴリズム> 書式#include <ベクトル> の#include <マップ> 書式#include <キュー> の#include <cstdioを> する#include <スタック> の#include <cmath> の#include <iostreamの> に#define LL長い長いです #define lowbit(x)は、x&( - X) の#define MAXN105万 の#define 0x3f3f3f3f INF 使用して 名前空間STDを、 INT [MAXN] [ 35 ]。// 存线性基 INT [MAXN] B [ 35 ]。// 存位置 のintK; ボイド追加(INT X) { int型 CUR = ++ 、K。 以下のために(int型 iは= 31、I> = 0 ; i-- ) { [k]は[I] = [K- 1 ] [i]は、 B [k]は[I] = bの[K- 1 ] [i]は、 } のために(int型 I = 31 ; I> = 0 ; i-- ) { 場合(X >> I) { 場合(![K] [I]) { [K] [I] =バツ; B [k]は[I] = CUR。 破ります; } 他 { 場合(CUR> B [k]は[I]) { スワップ([K] [i]は、X)。 スワップ(B [k]は[I]、CUR)。 } X ^ = [K] [i]は、 } } } } int型の照会(int型 L、INT R) { L = 1%のK + 1 。 R = Rの%のK + 1 。 もし(L>R) スワップ(L、R)。 int型 RET = 0 ; 以下のために(int型 iは= 31、I> = 0 ; i-- ) { 場合(B [R] [I]> = L) { RET = MAX(RET、[R] [I] ^ RET)。 } } 戻りRET。 } int型のmain() { int型のT。 scanf関数(" %のD "、&T)。 INTのN、M。 一方、(t-- ) { K = 0; scanf関数(" %d個の%のD "、&N、&M)。 int型のx; 以下のために(int型 i = 0 ; iがn <I ++の) { scanf関数(" %のD "、およびX)を、 (x)を追加します。 } int型の OP、Y、ANS = 0 。 一方、(M-- ) { scanf関数(" %D%dの"、&OP、およびX) もし(OPの== 0 ) { scanf関数(" %のD "、&Y)。 ANS =クエリ(X ^ ANS、Y ^ ANS)。 printf(" %d個の\ n " 、ANS)。 } 他 { (X追加 ^ ANS)を、 } } } }