問題一覧 > 通常問題

No.2294 Union Path Query (Easy)

レベル : / 実行時間制限 : 1ケース 4.000秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 27
作問者 : t98slidert98slider / テスター : akakimidoriakakimidori
0 ProblemId : 9155 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2023-05-11 02:56:26

問題文

NN 頂点 00 辺の重み付き無向グラフ GG と 変数 XX があります。グラフの頂点にはそれぞれ 00 から N1N-1 までの番号付けがされています。
変数 XX ははじめ X0 X_{0} で初期化されています。
グラフ GG における2頂点間 uu, vv の距離 dist(u,v){\rm dist} (u, v) を次のように定義します。
dist(u,v)=頂点 u から頂点 v への単純パスに含まれる辺すべての重みのXOR {\rm dist} (u, v) = 頂点\ u\ から頂点\ v\ への単純パスに含まれる辺すべての重みの{\rm XOR} 同一頂点での距離は dist(v,v)=0{\rm dist}(v, v) = 0 とします。
以下のような QQ 個のクエリが与えられるので、グラフ GG と変数 XX に対して順に処理してください。

  • 1 v w:頂点 vv と頂点 XX を重み ww の辺で結ぶ。与えられる入力ではこの操作によってグラフ GG に閉路ができないことが保証される。
  • 2 u v:頂点 uu と頂点 vv が連結でない場合-1を出力する。連結である場合、dist(u,v){\rm dist} (u, v) を出力し、 XXdist(u,v){\rm dist} (u, v) を加算する。
    その後、XXNN で割ったあまりとする。
  • 3 v:頂点 vv と同一の連結成分に含まれるすべての頂点対についての距離の総和を 998244353998244353 で割ったあまりを出力する。
    すなわち、頂点 vv と連結である頂点 (頂点 vv も含む)が KK 個あるとし、それぞれ u=(u1,u2,u3,,uK) u = (u_{1}, u_{2}, u_{3}, \cdots, u_{K}) とした際の (i=2Kj=1i1dist(ui,uj))mod 998244353 \left( \sum_{i=2}^{K}\sum_{j=1}^{i-1} {\rm dist}(u_{i}, u_{j}) \right) \bmod\ 998244353 を出力する。頂点 vv と連結である頂点が 11 つしかない (頂点 vv のみである) 場合、0 を出力する。
  • 4 valueXX に値 value{\rm value} を加算する。その後、XXNN で割ったあまりとする。

入力

N X0 QN\ X_{0}\ Q
Query1{\rm Query}_{1}
Query2{\rm Query}_{2}
Query3{\rm Query}_{3}
    \ \ \ \ \vdots
Queryi{\rm Query}_{i}
    \ \ \ \ \vdots
QueryQ{\rm Query}_{Q}

  • 1N2×1051 \leq N \leq 2 \times 10^{5}
  • 1Q3×1051 \leq Q \leq 3 \times 10^{5}
  • 0X0<N0 \leq X_{0} < N
  • Queryi{\rm Query}_{i}について

    タイプ1のクエリのとき
    1 vi wi1\ v_{i}\ w_{i}
    タイプ2のクエリのとき
    2 ui vi2\ u_{i}\ v_{i}
    タイプ3のクエリのとき
    3 vi3\ v_{i}
    タイプ4のクエリのとき
    4 valuei4\ {\rm value}_{i}
    0ui,vi,valuei<N0 \leq u_{i}, v_{i}, {\rm value}_{i} < N
    0wi<2300 \leq w_{i} < 2^{30}
    ・タイプ1のクエリによってグラフ GG に閉路ができないことが保証される。

  • 入力はすべて整数

出力

タイプ2、タイプ3のクエリが合計で KK 個与えられるとして、 i (1iK)i\ (1 \leq i \leq K) 行目にそれぞれのクエリの回答を1行に出力してください。最後に改行してください。

サンプル

サンプル1
入力
5 1 11
1 0 1
2 0 1
2 0 2
1 0 2
3 1
4 4
1 3 5
3 3
2 3 2
1 4 11
3 3
出力
1
-1
6
21
6
62

サンプル1の説明を見る (クリックで展開します)
初期状態では、NN 頂点 00 辺のグラフとなっています。変数は X=1X = 1 に初期化されています。
  • 1 0 1:1つ目のクエリでは、頂点 00 と頂点 X=1X = 1 を重み 11 の辺で結びます。
  • 2 0 1:2つ目のクエリでは、頂点 00 と頂点 11 の距離 dist(0,1)=1{\rm dist}(0, 1) = 1 を出力します。変数 XX11 を加算し、55 で割ったあまりとします。これによって変数 XX22 となります。
  • 2 0 2:3つ目のクエリでは、頂点 00 と頂点 22 は非連結ですので、1-1 を出力します
  • 1 0 2:4つ目のクエリでは、頂点 00 と頂点 X=2X = 2 を重み 22 の辺で結びます。
  • 3 1:5つ目のクエリでは、頂点 11 の所属する連結成分についての頂点対の距離の総和が求められます。
    dist(0,1)=1,dist(0,2)=2,dist(1,2)=3{\rm dist}(0,1) = 1, {\rm dist}(0,2) = 2, {\rm dist}(1,2) = 3ですので、これらの総和である 66 を出力します。
  • 4 4:6つ目のクエリでは、変数 XX44 を加算し、 55 で割った余りとします。これによって変数 XX11 となります。
  • 1 3 5:7つ目のクエリでは、頂点 33 と頂点 X=1X = 1 を重み 55 の辺で結びます。
  • 3 3:8つ目のクエリでは、頂点 33 の所属する連結成分についての頂点対の距離の総和が求められます。
    dist(0,1)=1,dist(0,2)=2,dist(0,3)=4,dist(1,2)=3,dist(1,3)=5,dist(2,3)=6{\rm dist}(0,1) = 1, {\rm dist}(0,2) = 2, {\rm dist}(0,3) = 4, {\rm dist}(1,2) = 3, {\rm dist}(1,3) = 5, {\rm dist}(2, 3) = 6 ですので、これらの総和である 2121 を出力します。
  • 2 3 2:9つ目のクエリでは、頂点 33 と頂点 22 の距離 dist(3,2)=6{\rm dist}(3, 2) = 6 を出力します。変数 XX66 を加算し、55 で割ったあまりとします。これによって変数 XX22 となります。
  • 1 4 11:10個目のクエリでは、頂点 44 と頂点 X=2X = 2 を重み 1111 の辺で結びます。
  • 3 3:11個目のクエリでは、頂点 33 の所属する連結成分についての頂点対の距離の総和が求められます。
    dist(0,1)=1,dist(0,2)=2,dist(0,3)=4,dist(0,4)=9,dist(1,2)=3,dist(1,3)=5,dist(1,4)=8,dist(2,3)=6,{\rm dist}(0,1) = 1, {\rm dist}(0,2) = 2, {\rm dist}(0,3) = 4, {\rm dist}(0,4) = 9,{\rm dist}(1,2) = 3, {\rm dist}(1,3) = 5, {\rm dist}(1,4) = 8, {\rm dist}(2, 3) = 6,
    dist(2,4)=11,dist(3,4)=13{\rm dist}(2, 4) = 11, {\rm dist}(3, 4) = 13 ですので、これらの総和である 6262 を出力します。

サンプル2
入力
7 5 15
2 0 5
1 1 542099847
1 0 126014135
2 6 1
1 3 606571677
1 4 630122460
3 2
2 5 3
2 6 6
1 2 660183552
3 3
2 1 3
2 5 1
2 5 2
3 1
出力
-1
-1
0
606571677
0
995222351
73942298
542099847
58594973
995222351

サンプル3
入力
8 3 10
2 6 2
1 1 789992496
1 4 345094264
1 2 654214606
1 5 184875134
3 1
1 7 378850180
1 0 389600407
3 0
2 2 3
出力
-1
900591855
327463395
654214606

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。