Submission #7949869


Source Code Expand

import sys
input = sys.stdin.readline
class balancing_tree:
    def __init__(self, n):
        self.N = n
        self.root = self.node(1<<n, 1<<n)
    
    def append(self, v):
        v += 1
        nd = self.root
        while True:
            if v == nd.value:
                self.delete(v-1)
                return 0
            else:
                mi, ma = min(v, nd.value), max(v, nd.value)
                if mi < nd.pivot:
                    nd.value = ma
                    if nd.left:
                        nd = nd.left
                        v = mi
                    else:
                        p = nd.pivot
                        nd.left = self.node(mi, p - (p&-p)//2)
                        break
                else:
                    nd.value = mi
                    if nd.right:
                        nd = nd.right
                        v = ma
                    else:
                        p = nd.pivot
                        nd.right = self.node(ma, p + (p&-p)//2)
                        break
    
    def leftmost(self, nd):
        if nd.left: return self.leftmost(nd.left)
        return nd
    
    def find_r(self, v):
        v += 1
        nd = self.root
        prev = 0
        if nd.value > v: prev = nd.value
        while True:
            if v < nd.value:
                if nd.value > v: prev = nd.value
                if nd.left:
                    nd = nd.left
                else:
                    return prev - 1
            else:
                if nd.right:
                    nd = nd.right
                else:
                    return prev - 1
    
    def delete(self, v, nd = None, prev = None):
        v += 1
        if not nd: nd = self.root
        if not prev: prev = nd
        while v != nd.value:
            prev = nd
            if v <= nd.value:
                if nd.left:
                    nd = nd.left
                else:
                    return 0
            else:
                if nd.right:
                    nd = nd.right
                else:
                    return 0
        if (not nd.left) and (not nd.right):
            if nd.value < prev.value:
                prev.left = None
            else:
                prev.right = None
        elif not nd.left:
            if nd.value < prev.value:
                prev.left = nd.right
            else:
                prev.right = nd.right
        elif not nd.right:
            if nd.value < prev.value:
                prev.left = nd.left
            else:
                prev.right = nd.left
        else:
            nd.value = self.leftmost(nd.right).value
            self.delete(nd.value - 1, nd.right, nd)
    
    class node:
        def __init__(self, v, p):
            self.value = v
            self.pivot = p
            self.left = None
            self.right = None

NN = 30
bt = balancing_tree(NN)
N, Q = map(int, input().split())
A = [int(a) for a in input().split()]
for a in A:
    bt.append(a)

X = []
for _ in range(Q):
    l, r, x = map(int, input().split())
    a = bt.find_r(l-1)
    c = 0
    k = 0
    while a <= r:
        bt.delete(a)
        k ^= a
        a = bt.find_r(a)
        c ^= 1
    print(k)
    if c:
        bt.append(x)

Submission Info

Submission Time
Task E - Exclusive OR Queries
User Kiri8128
Language PyPy3 (2.4.0)
Score 500
Code Size 3352 Byte
Status AC
Exec Time 2411 ms
Memory 126052 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 3
AC × 20
Set Name Test Cases
Sample 00, 01, 02
All 00, 01, 02, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26
Case Name Status Exec Time Memory
00 AC 165 ms 38256 KiB
01 AC 165 ms 38256 KiB
02 AC 164 ms 38256 KiB
10 AC 381 ms 59868 KiB
11 AC 323 ms 53084 KiB
12 AC 393 ms 62556 KiB
13 AC 1597 ms 123816 KiB
14 AC 1600 ms 123612 KiB
15 AC 2411 ms 126052 KiB
16 AC 2359 ms 125012 KiB
17 AC 1819 ms 122920 KiB
18 AC 1815 ms 123196 KiB
19 AC 1742 ms 124220 KiB
20 AC 1611 ms 123324 KiB
21 AC 1543 ms 122280 KiB
22 AC 2194 ms 124968 KiB
23 AC 2004 ms 123048 KiB
24 AC 1859 ms 123836 KiB
25 AC 1270 ms 123324 KiB
26 AC 1969 ms 124200 KiB