提出 #22132943


ソースコード 拡げる

class segtree():
    n=1
    size=1
    log=2
    d=[0]
    op=None
    e=10**15
    def __init__(self,V,OP,E):
        self.n=len(V)
        self.op=OP
        self.e=E
        self.log=(self.n-1).bit_length()
        self.size=1<<self.log
        self.d=[E for i in range(2*self.size)]
        for i in range(self.n):
            self.d[self.size+i]=V[i]
        for i in range(self.size-1,0,-1):
            self.update(i)
    def set(self,p,x):
        assert 0<=p and p<self.n
        p+=self.size
        self.d[p]=x
        for i in range(1,self.log+1):
            self.update(p>>i)
    def get(self,p):
        assert 0<=p and p<self.n
        return self.d[p+self.size]
    def prod(self,l,r):
        assert 0<=l and l<=r and r<=self.n
        sml=self.e
        smr=self.e
        l+=self.size
        r+=self.size
        while(l<r):
            if (l&1):
                sml=self.op(sml,self.d[l])
                l+=1
            if (r&1):
                smr=self.op(self.d[r-1],smr)
                r-=1
            l>>=1
            r>>=1
        return self.op(sml,smr)
    def all_prod(self):
        return self.d[1]
    def max_right(self,l,f):
        assert 0<=l and l<=self.n
        assert f(self.e)
        if l==self.n:
            return self.n
        l+=self.size
        sm=self.e
        while(1):
            while(l%2==0):
                l>>=1
            if not(f(self.op(sm,self.d[l]))):
                while(l<self.size):
                    l=2*l
                    if f(self.op(sm,self.d[l])):
                        sm=self.op(sm,self.d[l])
                        l+=1
                return l-self.size
            sm=self.op(sm,self.d[l])
            l+=1
            if (l&-l)==l:
                break
        return self.n
    def min_left(self,r,f):
        assert 0<=r and r<self.n
        assert f(self.e)
        if r==0:
            return 0
        r+=self.size
        sm=self.e
        while(1):
            r-=1
            while(r>1 & (r%2)):
                r>>=1
            if not(f(self.op(self.d[r],sm))):
                while(r<self.size):
                    r=(2*r+1)
                    if f(self.op(self.d[r],sm)):
                        sm=self.op(self.d[r],sm)
                        r-=1
                return r+1-self.size
            sm=self.op(self.d[r],sm)
            if (r& -r)==r:
                break
        return 0
    def update(self,k):
        self.d[k]=self.op(self.d[2*k],self.d[2*k+1])

N,Q=map(int,input().split())
A=[int(i) for i in input().split()]
def xor(x,y):
    return x^y
G=segtree(A,xor,0)
for i in range(Q):
    t,x,y=map(int,input().split())
    if t==1:
        G.set(x-1,G.get(x-1)^y)
    if t==2:
        l,r=x-1,y-1
        print(G.prod(l,r+1))

提出情報

提出日時
問題 F - Range Xor Query
ユーザ H20
言語 PyPy3 (7.3.0)
得点 600
コード長 2861 Byte
結果 AC
実行時間 1382 ms
メモリ 167468 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 2
AC × 20
セット名 テストケース
Sample sample_01.txt, sample_02.txt
All handmade_00.txt, handmade_01.txt, max_00.txt, max_01.txt, max_02.txt, max_03.txt, max_04.txt, max_05.txt, max_06.txt, max_07.txt, power_of_2_00.txt, power_of_2_01.txt, power_of_2_02.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, sample_01.txt, sample_02.txt
ケース名 結果 実行時間 メモリ
handmade_00.txt AC 75 ms 62488 KiB
handmade_01.txt AC 52 ms 62492 KiB
max_00.txt AC 1038 ms 167244 KiB
max_01.txt AC 1054 ms 167404 KiB
max_02.txt AC 1014 ms 167468 KiB
max_03.txt AC 1278 ms 167332 KiB
max_04.txt AC 1382 ms 167456 KiB
max_05.txt AC 1271 ms 167364 KiB
max_06.txt AC 722 ms 167296 KiB
max_07.txt AC 1015 ms 167372 KiB
power_of_2_00.txt AC 890 ms 127692 KiB
power_of_2_01.txt AC 861 ms 127148 KiB
power_of_2_02.txt AC 896 ms 165728 KiB
random_00.txt AC 913 ms 87428 KiB
random_01.txt AC 719 ms 130896 KiB
random_02.txt AC 334 ms 76524 KiB
random_03.txt AC 812 ms 121608 KiB
random_04.txt AC 251 ms 73412 KiB
sample_01.txt AC 51 ms 62648 KiB
sample_02.txt AC 54 ms 62520 KiB