問題一覧 > 通常問題

No.2296 Union Path Query (Hard)

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

問題文

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 への単純パスに含まれる辺すべての重みの総和 {\rm dist} (u, v) = 頂点\ u\ から頂点\ v\ への単純パスに含まれる辺すべての重みの総和 同一頂点での距離は 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 と同一の連結成分に含まれるすべての頂点対についての距離の最大値を出力する。(つまり頂点 vv が含まれる木の直径を出力する。)
    頂点 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
    0wi1090 \leq w_{i} \leq 10^{9}
    ・タイプ1のクエリによってグラフ GG に閉路ができないことが保証される。

  • 入力はすべて整数

出力

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

サンプル

サンプル1
入力
5 1 10
1 0 1
2 0 1
1 3 5
1 1 3
3 0
1 4 6
2 4 0
2 4 3
2 3 1
3 3
出力
1
9
10
11
8
11

サンプル1の説明を見る (クリックで展開します)

初期状態は NN 頂点 00 辺となっていて変数は X=1X = 1 に初期化されています。
  • 1 0 1:1つ目のクエリでは、頂点 00 と頂点 X=1X = 1 を重み 11 の辺で結びます。(b)
  • 2 0 1:2つ目のクエリでは、dist(0,1)=1{\rm dist}(0, 1) = 1 を出力します。これにより変数は X=1+1=2X = 1 + 1 = 2 となります。(c)
  • 1 3 5:3つ目のクエリでは、頂点 33 と頂点 X=2X = 2 を重み 55 の辺で結びます。(d)
  • 1 1 3:4つ目のクエリでは、頂点 11 と頂点 X=2X = 2 を重み 33 の辺で結びます。(d)
  • 3 0:5つ目のクエリでは、頂点 00 が所属している連結成分の木の直径を出力します。これは dist(0,3)=9{\rm dist}(0, 3) = 9 です。
  • 1 4 6:6つ目のクエリでは、頂点 44 と頂点 X=2X = 2 を重み 66 の辺で結びます。(e)
  • 2 4 0:7つ目のクエリでは、dist(4,0)=10{\rm dist}(4, 0) = 10 を出力します。これにより変数は X=(2+10)mod 5=1X = (2 + 10) \bmod\ 5 = 1 となります。(f)
  • 2 4 3:8つ目のクエリでは、dist(4,3)=11{\rm dist}(4, 3) = 11 を出力します。これにより変数は X=(2+11)mod 5=3X = (2 + 11) \bmod\ 5 = 3 となります。(g)
  • 2 3 1:9つ目のクエリでは、dist(3,1)=8{\rm dist}(3, 1) = 8 を出力します。これにより変数は X=(3+8)mod 5=1X = (3 + 8) \bmod\ 5 = 1 となります。(h)
  • 3 3:10個目のクエリでは、頂点 33 が所属している連結成分の木の直径を出力します。これは dist(3,4)=11{\rm dist}(3, 4) = 11 です。

サンプル2
入力
200000 0 9
2 0 1
1 1 1000000000
4 1
1 2 1000000000
4 1
1 3 1000000000
4 1
1 4 1000000000
3 1
出力
-1
4000000000

サンプル3
入力
200000 0 8
1 1 3
2 0 1
1 2 5
2 2 3
2 3 2
1 1 40
1 2 40
2 3 0
出力
3
5
5
88

サンプル4
入力
200000 1 12
1 0 1000000000
1 2 1000000000
4 2
1 2 1000000000
1 4 1000000000
4 2
1 4 1000000000
1 6 1000000000
2 0 6
4 2
1 6 1000000000
2 0 7
出力
6000000000
7000000000

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