結果
問題 |
No.1054 Union add query
|
ユーザー |
![]() |
提出日時 | 2025-03-20 20:56:16 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 447 ms / 2,000 ms |
コード長 | 1,187 bytes |
コンパイル時間 | 147 ms |
コンパイル使用メモリ | 82,736 KB |
実行使用メモリ | 181,232 KB |
最終ジャッジ日時 | 2025-03-20 20:56:27 |
合計ジャッジ時間 | 4,426 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 8 |
ソースコード
import sys def main(): input = sys.stdin.read().split() idx = 0 N = int(input[idx]); idx += 1 Q = int(input[idx]); idx += 1 parent = list(range(N + 1)) # 1-based indexing diff = [0] * (N + 1) add = [0] * (N + 1) rank = [1] * (N + 1) def find(u): path = [] while parent[u] != u: path.append(u) u = parent[u] for v in reversed(path): orig_parent = parent[v] parent[v] = u diff[v] += diff[orig_parent] return u for _ in range(Q): T = int(input[idx]); idx += 1 A = int(input[idx]); idx += 1 B = int(input[idx]); idx += 1 if T == 1: ra = find(A) rb = find(B) if ra == rb: continue if rank[ra] < rank[rb]: ra, rb = rb, ra parent[rb] = ra diff[rb] = add[rb] - add[ra] if rank[ra] == rank[rb]: rank[ra] += 1 elif T == 2: ra = find(A) add[ra] += B else: ra = find(A) print(diff[A] + add[ra]) if __name__ == '__main__': main()