結果
| 問題 |
No.1641 Tree Xor Query
|
| コンテスト | |
| ユーザー |
sotanishy
|
| 提出日時 | 2021-08-06 22:18:27 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 269 ms / 5,000 ms |
| コード長 | 1,418 bytes |
| コンパイル時間 | 160 ms |
| コンパイル使用メモリ | 82,496 KB |
| 実行使用メモリ | 113,108 KB |
| 最終ジャッジ日時 | 2024-09-17 02:21:32 |
| 合計ジャッジ時間 | 2,896 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 18 |
ソースコード
import sys
input = sys.stdin.readline
class FenwickTree:
def __init__(self, size):
self.data = [0] * (size + 1)
self.size = size
# i is exclusive
def prefix_sum(self, i):
s = 0
while i > 0:
s ^= self.data[i]
i -= i & -i
return s
def add(self, i, x):
i += 1
while i <= self.size:
self.data[i] ^= x
i += i & -i
def euler_tour(G, root):
N = len(G)
stack = [(root, -1, 1), (root, -1, 0)]
et = []
first = [-1] * N
last = [-1] * N
k = 0
while stack:
v, p, t = stack.pop()
if t == 0:
et.append(v)
first[v] = k
k += 1
for c in G[v]:
if c != p:
stack.append((c, v, 1))
stack.append((c, v, 0))
else:
last[v] = k
return et, first, last
N, Q = map(int, input().split())
C = list(map(int, input().split()))
G = [[] for _ in range(N)]
for _ in range(N-1):
a, b = map(lambda x: int(x) - 1, input().split())
G[a].append(b)
G[b].append(a)
et, first, last = euler_tour(G, 0)
ft = FenwickTree(N)
for i in range(N):
ft.add(first[i], C[i])
for _ in range(Q):
T, x, y = map(int, input().split())
x -= 1
if T == 1:
ft.add(first[x], y)
else:
print(ft.prefix_sum(last[x]) ^ ft.prefix_sum(first[x]))
sotanishy