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