Submission #7949869


Source Code Expand

Copy
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
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
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 KB

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 KB
01 AC 165 ms 38256 KB
02 AC 164 ms 38256 KB
10 AC 381 ms 59868 KB
11 AC 323 ms 53084 KB
12 AC 393 ms 62556 KB
13 AC 1597 ms 123816 KB
14 AC 1600 ms 123612 KB
15 AC 2411 ms 126052 KB
16 AC 2359 ms 125012 KB
17 AC 1819 ms 122920 KB
18 AC 1815 ms 123196 KB
19 AC 1742 ms 124220 KB
20 AC 1611 ms 123324 KB
21 AC 1543 ms 122280 KB
22 AC 2194 ms 124968 KB
23 AC 2004 ms 123048 KB
24 AC 1859 ms 123836 KB
25 AC 1270 ms 123324 KB
26 AC 1969 ms 124200 KB


2024-07-23 (Tue)
08:41:44 +09:00