質問意図されている:あなたの長さの配列のN- $ $、関数$ F(L、R)の定義= A_ {1} \ oplus A_ {L + 1} \ oplus ... \ oplus A_ {R} $、$を与えますF(L、R)は、F(L、L)\ oplusのF(L、L + 1)\ oplus ... \ F(L、R)oplus \ oplusのF(L + 1、L + 1)\ oplus = (L + 1、R)\ oplus ... \ F oplus(R、R)$ F、二つの動作があり、配列内の最初の要素は$ ... [X]の$ $ yはなります$、第2の算出$ F(L、R)$値。
思考:テーブルを再生することが見出された後のみなら$ L $と$ R&LTの$同時に他の場合には奇数又は偶数$ F(L、R)$はない$ 0 $であったが、ある$ F(L、R)$である$ 0 $そして$ F(L、R)は= [L] \ oplus A [L + 2] \ oplus ... \ oplus [R-2] \ oplus A [R] $、2つのクエリが変更を伴うので動作モード、セグメントツリーを維持するために使用され、各ノードは2つの値を維持する:$ $奇数XOR結果の間隔を表すW、間隔は$ $ WW偶数番目のXORの結果を表しました。
ときに最初の成果
- 奇数番現在のアイテム、$ツリー[K] .W $値を入力し、$ツリー[K] .WW = 0 $する間
- 現在のアイテムのも、用語、$ツリー[K] .W = 0 $する間$ツリー[K] .WW $値を、入力
操作を変更する場合
- 奇数用語のエントリを変更する必要性は、その後、$ツリー[k]は変更$を.W
- 入力項目を修正する必要が、その後も$ツリー[K] .WW $が変更されました
場合は、クエリ操作
- $ $ Lが奇数の場合は、答えを更新するために$ ANS = ANS \ツリーoplus [K] .W $によって、
- $ $ Lが偶数であれば、答えを更新するために$ ANS = ANS \ツリーoplus [K] .WW $と
書式#include <iostreamの> の#include <cstdioを> 使用して 名前空間はstdを、 const int型 N = 100010 ; 構造体ノード{ int型のL、R、WW、W。 }。 int型、B、X、Y、年。 ノードツリー[ 4 * N]。 空のビルド(int型 K、int型の LEF、int型リグ) { ツリー[K] .L = LEF、ツリー[K] .R = リグ。 もし(ツリー[K] .L == ツリー[K] .R){ 場合(0 ==ツリー[K] .L%2 ){ ツリー[K] .W = 0、scanf関数(" %のD "、&ツリー[K] .WW)。 } 他の{ ツリー[K] .WW = 0、scanf関数(" %のD "、&ツリー[K] .W)。 } 返します。 } INT半ば=(LEF +リグ)/ 2 。 構築(K * 2、LEF、半ば)。構築(K * 2 + 1、ミッド+ 1 、リグ)。 ツリー[K] .W =ツリー[K * 2 ] .W ^ツリー[K * 2 + 1 ] .W。 ツリー[K] .WW =ツリー[K * 2 ] .WW ^ツリー[K * 2 + 1 ] .WW。 } 無効 change_point(int型のk) { もし(ツリー[K] .L == ツリー[K] .R){ 場合(ツリー[K] .L%2 == 0)ツリー[K] .WW = Y。 他のツリー[K] .W = Y。 返します。 } INT半ば=(ツリー[K] .L +ツリー[K] .R)/ 2 。 もし(x <= MID)change_point(2 * K)。 他 change_point(2 * K + 1 )。 ツリー[K] .W =ツリー[ 2 * K] .W ^ツリー[ 2 * K + 1 ] .W。 ツリー[K] .WW =ツリー[ 2 * K] .WW ^ツリー[ 2 * K + 1 ] .WW。 } 無効 ask_interval(int型のk) { もし(ツリー[K] .L> = &&ツリー[K] .R <= B){ 場合(0 ==%2)ANS ^ = ツリー[K] .WW。 他の ANS ^ = ツリー[K] .W。 返します。 } INT半ば=(ツリー[K] .L +ツリー[K] .R)/ 2 。 もし(<= MID)ask_interval(2 * K)。 もし(B> MID)ask_interval(2 * K + 1 )。 } int型のmain() { INT T、T、N、Q、ICAS = 0 。 scanf関数(" %のD "、&T)。 一方、(T-- ){ printf(" ケース#%dの:\ N "、++ ICAS)。 scanf関数(" %d個の%のD "、&N、&Q)、(ビルド1、1 、n)を。 一方、(q-- ){ scanf関数(" %のD "、&T)。 もし(0 == T){ scanf関数(" %dの%のD "、およびX&Y)。 change_point(1 )。 } 他の{ ANS = 0、scanf関数(" %D%dの"、&、&B)。 もし(%2 == B%2)ask_interval(1 )。 printf(" %d個の\ n " 、ANS)。 } } } リターン 0 ; }