Q = 5# クエリ―数 query = [ [2, 1, 5], [1, 3], [2, 1, 5], [1, 5], [2, 1, 5] ] #--------------------------- edge = [] # インデックスを0スタートにする for A, B in edges: edge.append((A - 1, B - 1))
# 最後まで残っている辺を求める last = [True] * M for q in query: if q[0] == 1: q[1] -= 1 last[q[1]] = False else: q[1] -= 1 q[2] -= 1
# union-find木 uf = [-1] * N defroot(i): whileTrue: if uf[i] < 0: return i if uf[uf[i]] < 0: return uf[i] uf[i] = uf[uf[i]] i = uf[i]
defunite(i, j): i = root(i) j = root(j) if i == j: return # union by size if uf[i] > uf[j]: i, j = j, i uf[i] += uf[j] uf[j] = i
ans = [] for i inrange(M): if last[i]: A, B = edge[i] unite(A, B)
# クエリ―を逆順に処理する for q inreversed(query): if q[0] == 1: A, B = edge[q[1]] unite(A, B) else: _, U, V = q ans.append("移動可能"if root(U) == root(V) else"移動不可")
# クエリ―の順番を戻して、回答を表示 for s inreversed(ans): print(s)