結果

問題 No.1054 Union add query
ユーザー lam6er
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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()
0