Submission #19042056


Source Code Expand

import sys
import math
sys.setrecursionlimit(10**8)
class segki():
    #modeで関数を選べます。(min,max,sum,prd(product),gcd,lmc,^,&,|)
    def __init__(self,N,ls,mode='min'): #葉の数N,要素ls
        self.mode = mode
        self.default = self.setdef()
        self.N = N
        self.K = (N-1).bit_length()
        self.N2 = 1 << self.K
        self.dat = [self.default]*(2**(self.K+1))
        for i in range(self.N): #葉の構築
            self.dat[self.N2+i] = ls[i]
        self.build()
    
    def setdef(self):
        if self.mode == 'min':return 1 << 60
        elif self.mode == 'max':return -(1 << 60)
        elif self.mode == 'sum':return 0
        elif self.mode == 'prd':return 1
        elif self.mode == 'gcd':return 0
        elif self.mode == 'lmc':return 1
        elif self.mode == '^':return 0
        elif self.mode == '&':return (1 << 60)-1
        elif self.mode == '|':return 0
    
    def build(self):
        for j in range(self.N2-1,-1,-1):
            self.dat[j] = self.func(self.dat[j<<1],self.dat[j<<1|1]) #親が持つ条件

    def func(self,x,y):#関数を指定
        if self.mode == 'min': return min(x,y)
        elif self.mode == 'max': return max(x,y)
        elif self.mode == 'sum': return x+y
        elif self.mode == 'prd': return x*y
        elif self.mode == 'gcd': return math.gcd(x,y)
        elif self.mode == 'lmc': return (x*y)//math.gcd(x,y)
        elif self.mode == '^': return x^y
        elif self.mode == '&': return x&y
        elif self.mode == '|': return x|y
    
    def leafvalue(self,x):
        return self.dat[x+self.N2]

    def update(self,x,y): #index(x)をyに変更
        i = x+self.N2
        self.dat[i] = y
        while (i>0): #親の値を変更
            i >>= 1
            self.dat[i] = self.func(self.dat[i<<1],self.dat[i<<1|1])
        return
    
    def query(self,L,R):  # [L,R)の区間取得
        L += self.N2
        R += self.N2
        vL = self.default
        vR = self.default
        while L < R:
            if L & 1:
                vL = self.func(vL,self.dat[L])
                L += 1
            if R & 1:
                R -= 1
                vR = self.func(self.dat[R],vR)
            L >>= 1
            R >>= 1
        return self.func(vL,vR)

N,Q = map(int,input().split())
lsA = list(map(int,input().split()))
lsTXY = []
for i in range(Q):
    lsTXY.append(list(map(int,input().split())))
SG = segki(N,lsA,mode='^')
for i in range(Q):
    if lsTXY[i][0] == 1:
        SG.update(lsTXY[i][1]-1,SG.leafvalue(lsTXY[i][1]-1)^lsTXY[i][2])
    if lsTXY[i][0] == 2:
        print(SG.query(lsTXY[i][1]-1,lsTXY[i][2]))

Submission Info

Submission Time
Task F - Range Xor Query
User kohei2019
Language PyPy3 (7.3.0)
Score 600
Code Size 2723 Byte
Status AC
Exec Time 900 ms
Memory 162144 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 2
AC × 20
Set Name Test Cases
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
Case Name Status Exec Time Memory
handmade_00.txt AC 61 ms 62656 KiB
handmade_01.txt AC 57 ms 62680 KiB
max_00.txt AC 782 ms 161032 KiB
max_01.txt AC 767 ms 159900 KiB
max_02.txt AC 749 ms 159828 KiB
max_03.txt AC 793 ms 162144 KiB
max_04.txt AC 900 ms 161252 KiB
max_05.txt AC 789 ms 160476 KiB
max_06.txt AC 680 ms 158532 KiB
max_07.txt AC 771 ms 160068 KiB
power_of_2_00.txt AC 644 ms 141460 KiB
power_of_2_01.txt AC 643 ms 141308 KiB
power_of_2_02.txt AC 712 ms 146276 KiB
random_00.txt AC 682 ms 126192 KiB
random_01.txt AC 525 ms 125932 KiB
random_02.txt AC 248 ms 81404 KiB
random_03.txt AC 622 ms 131828 KiB
random_04.txt AC 187 ms 76612 KiB
sample_01.txt AC 49 ms 62644 KiB
sample_02.txt AC 53 ms 62544 KiB