結果
| 問題 |
No.1641 Tree Xor Query
|
| コンテスト | |
| ユーザー |
wolgnik
|
| 提出日時 | 2021-08-06 22:23:20 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,597 bytes |
| コンパイル時間 | 162 ms |
| コンパイル使用メモリ | 81,648 KB |
| 実行使用メモリ | 143,024 KB |
| 最終ジャッジ日時 | 2024-09-17 02:27:39 |
| 合計ジャッジ時間 | 3,215 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 WA * 14 |
ソースコード
import sys
input = sys.stdin.readline
N, Q = map(int, input().split())
a = list(map(int, input().split()))
e = [[] for _ in range(N + 1)]
for _ in range(N - 1):
u, v = map(int, input().split())
e[u].append(v)
e[v].append(u)
eulbase = pow(10, 6)
lime = [[] for _ in range(N + 1)]
limevis = [0] * (N + 1)
def limitedge():
global limevis
global lime
limevis[1] = 1
s = [1]
while len(s):
x = s.pop()
for y in e[x]:
if limevis[y]: continue
lime[x].append(y)
limevis[y] = 1
s.append(y)
euler = []
depth = [0] * (N + 1)
table = [0] * (N + 1)
table2 = [0] * (N + 1)
def eulerdfs():
global euler
global depth
global table
s = [1]
while len(s):
x = s.pop()
if x >= 0:
euler.append(depth[x] * eulbase + x)
for y in lime[x]:
s.append(~x)
s.append(y)
depth[y] = depth[x] + 1
else: euler.append(depth[~x] * eulbase + ~x)
limitedge()
eulerdfs()
for i in range(len(euler) - 1, -1, -1): table[euler[i] % eulbase] = i
for i in range(len(euler)): table2[euler[i] % eulbase] = i
eulera = [0] * len(euler)
for x in range(1, N + 1):
eulera[table[x]] = a[x - 1]
#print(euler)
#print(table, depth)
class SegTree:
def segfunc(self, x, y):
return x ^ y
def __init__(self, n, ide_ele, init_val):
#####単位元######
self.ide_ele = ide_ele
#num:n以上の最小の2のべき乗
self.num = 2 ** (n - 1).bit_length()
self.seg = [self.ide_ele] * 2 * self.num
#set_val
for i in range(n):
self.seg[i + self.num - 1] = init_val[i]
#built
for i in range(self.num - 2, -1, -1) :
self.seg[i] = self.segfunc(self.seg[2 * i + 1], self.seg[2 * i + 2])
def update(self, k, x):
k += self.num - 1
self.seg[k] = x
while k + 1:
k = (k - 1) // 2
self.seg[k] = self.segfunc(self.seg[k * 2 + 1], self.seg[k * 2 + 2])
def query(self, p, q):
if q <= p:
return self.ide_ele
p += self.num - 1
q += self.num - 2
res = self.ide_ele
while q - p > 1:
if p & 1 == 0:
res = self.segfunc(res, self.seg[p])
if q & 1 == 1:
res = self.segfunc(res, self.seg[q])
q -= 1
p = p // 2
q = (q - 1) // 2
if p == q:
res = self.segfunc(res, self.seg[p])
else:
res = self.segfunc(self.segfunc(res, self.seg[p]), self.seg[q])
return res
#print(table, table2)
seg = SegTree(len(euler), 0, eulera)
for _ in range(Q):
t, x, y = map(int, input().split())
if t == 1:
seg.update(x, seg.query(x, x + 1) ^ y)
if t == 2:
print(seg.query(table[x], table2[x] + 1))
wolgnik