class non_commutative_xor_segment_tree: def __init__(self,n,init,ope,E): self.n=n # 配列のサイズは 2**n self.N=1<>i]=self.time self.time+=1 def get(self,i,j): # 最新の node[i][j] を求める # last_update[i][j] がすでに最新(==self.lazy[(j+self.N)>>i])だったらそのまま返す if self.last_update[i][j]==self.lazy[(j+self.N)>>i]: return self.node[i][j] # そうでないとき,下にもぐって node[i][j] を求める self.node[i][j]=self.ope(self.get(i-1,j),self.get(i-1,j^(1<<(i-1)))) # node[i][j] は最新であることを記録する self.last_update[i][j]=self.lazy[(j+self.N)>>i] return self.node[i][j] def query(self,L,R,X): # A_{L^X}, A_{(L+1)^X}, ..., A_{(R-1)^X} についての答えを求める # 高々 2n 個のノードを見る res=self.E for i in range(self.n+1): if (L>>i)&1 and L+(1<