結果

問題 No.1054 Union add query
コンテスト
ユーザー 👑 tttmmmyyyy
提出日時 2026-10-29 23:49:01
言語 Fix
(1.6.0 + cp-library + minilib)
コンパイル:
fix_c _filename_
実行:
./a.out
結果
AC  
実行時間 128 ms / 2,000 ms
+ 521µs
コード長 1,496 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 9,737 ms
コンパイル使用メモリ 669,832 KB
実行使用メモリ 42,316 KB
最終ジャッジ日時 2026-10-29 23:49:15
合計ジャッジ時間 13,288 ms
ジャッジサーバーID
(参考情報)
judge7_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 8
権限があれば一括ダウンロードができます
コンパイルメッセージ
make: 'lib.o' は更新済みです.

ソースコード

diff #
raw source code

module Main;

import CPLib.IO;

main : IO () = (
    let n = *read_i; let q = *read_i;
    let gs = range(0, n).map(|i| [i]).to_array; // groups, array of array of vertices
    let gn = fill(n, 0); // group number 
    let vn = fill(n, 0); // vertex number
    let v2g = range(0, n).to_array; // vertex to group
    range(0, q).fold_m((gs, gn, vn, v2g), |_, (gs, gn, vn, v2g)|
        let t = *read_i; let a = *read_i; let b = *read_i;
        if t == 1 {
            let a = a - 1; let b = b - 1;
            if v2g.@(a) == v2g.@(b) { (gs, gn, vn, v2g).pure };
            let (a, b) = if gs.@(v2g.@(a)).@size < gs.@(v2g.@(b)).@size { (a, b) } else { (b, a) };
            let i = v2g.@(a);
            let j = v2g.@(b);
            let n = gn.@(i);
            let m = gn.@(j);
            let (gs, ga) = gs[i].ixchg([]);
            let (gs, gb) = gs[j].ixchg([]);
            let v2g = ga.to_iter.fold(v2g, |v, v2g| v2g[v].iset(j));
            let vn = ga.to_iter.fold(vn, |v, vn| vn[v].imod(add(n - m)));
            let gb = gb.append(ga);
            let gs = gs[j].iset(gb);
            (gs, gn, vn, v2g).pure
        } else if t == 2 {
            let a = a - 1;
            let i = v2g.@(a);
            let gn = gn[i].imod(add(b));
            (gs, gn, vn, v2g).pure
        } else {
            let a = a - 1;
            let i = v2g.@(a);
            let ans = vn.@(a) + gn.@(i);
            "{}".printfln((ans,));;
            (gs, gn, vn, v2g).pure
        }
    );;
    pure()
);
0