#discovery2016finale. [discovery_2016_final_e]アメージングな二分探索木は、きみが作る!

[discovery_2016_final_e]アメージングな二分探索木は、きみが作る!

問題文

あなたはDISCO社の面接を受けています。面接前に 00 個のノードからなる二分探索木 TT をあなたは与えられました。

あなたは面接官から以下の QQ 個のクエリを与えられた順序で処理しなさいというお題を与えられました。あなたは、 QQ 個のクエリを高速に処理して面接官を驚かせることにしました。

クエリの種類を以下に示します。

  1. 1 v : TT に値が vv であるようなノードを適切な位置に挿入せよ。
  2. 2 v : TT に含まれる値が vv であるようなノード uu の左部分木 lstlst と右部分木 rstrst について、高さの差 h(lst)h(rst)h(lst) - h(rst) を出力せよ。
  3. 3 v : TT に含まれる値が vv であるようなノード uu に左の子ノードが存在したならば、 uu を右回転せよ。左の子ノードが存在しなかったならば-1を出力せよ。
  4. 4 v : TT に含まれる値が vv であるようなノード uu に右の子ノードが存在したならば、 uu を左回転せよ。右の子ノードが存在しなかったならば-1を出力せよ。

上記の種類 11 のクエリにおいて、値が vv であるようなノードが TT に存在しないことが保証されます。 上記の種類 2,3,42,3,4 のクエリにおいて、値が vv であるようなノードが TT に存在することが保証されます。


  • ここで、二分探索木 TT の高さは以下のように定義される。

    • あるノード uu を根とする二分探索木の高さ h(u)h(u)uu の左部分木 lstlstuu の右部分木 rstrst としたとき、 h(u)=max(h(lst),h(rst))+1h(u) = max(h(lst), h(rst))+1 で表される。
    • ここで、 uu に左部分木 lstlst が存在しないときは h(lst)=0h(lst) = 0 として扱う。
    • 同様に、 uu に右部分木 rstrst が存在しないときは h(rst)=0h(rst) = 0 として扱う。
  • 二分探索木 TT へノード uu を挿入する操作は以下のようにして行われる。なお、この操作の結果は TTuu が与えられたとき一意に定まることが保証されている。

    1. TT00 個のノードからなるとき、 TTuu を根とする二分探索木にし処理を終了する。

    2. TT11 個以上のノードからなるとき、以下の条件を満たすように uu をあるノードの子にし、処理を終了する。

      • あるノード ww が持つ直接の子の数は最大でもたかだか 22 つである(これはそれぞれ左の子、右の子と呼ばれる)。
      • あるノード ww の左の子孫であるようなノードが持つ値はどれも ww の値未満である。
      • あるノード ww の右の子孫であるようなノードが持つ値はどれも ww の値以上である。
  • 二分探索木 TT に含まれるノード uu の右回転は以下のようにして行われる。この操作は uu に左の子が存在しないとき行うことはできない。

    1. uu の左の子を ll とする。
    2. uull をつなぐ辺を削除する。また、 uu に親 pp が存在するとき、 uupp をつなぐ辺を削除し、 ppll の親となるように接続する。
    3. ll に右の子 rr が存在するならば、 llrr をつなぐ辺を削除し、 rruu の左の子となるように接続する。
    4. uull の右の子となるように接続する。
  • 二分探索木 TT に含まれるノード uu の左回転は以下のようにして行われる。この操作は uu に右の子が存在しないとき行うことはできない。

    1. uu の右の子を rr とする。
    2. uurr をつなぐ辺を削除する。また、 uu に親 pp が存在するとき、 uupp をつなぐ辺を削除し、 pprr の親となるように接続する。
    3. rr に左の子 ll が存在するならば、 rrll をつなぐ辺を削除し、 lluu の右の子となるように接続する。
    4. uurr の左の子となるように接続する。

入力

入力は以下の形式で標準入力から与えられる。

QQ t1t_1 v1v_1 .. .. .. tQt_Q vQv_Q

  • 11 行目に 11 行にクエリの数を表す整数 Q(1Q400,000)Q (1≦Q≦400,000) が与えられる。
  • 続く QQ 行のち ii 行目では ii 番目のクエリの種類と、ノードの値を表す整数 ti,vi(1ti4,1vi400,000)t_i, v_i(1≦t_i≦4,1≦v_i≦400,000) が空白区切りで与えられる。
  • 種類 11 のクエリにおいて、値が vv であるようなノードが TT 中に存在しないことが保証される。
  • 種類 2,3,42,3,4 のクエリにおいて、値が vv であるようなノードが TT 中に存在することが保証される。

出力

各クエリの結果を与えられた順に 11 行ごとに出力せよ。出力する場合は以下の 33 種類であることに注意せよ。

  1. 種類 22 のクエリ
  2. 種類 33 のクエリにおいて、値が vv であるようなノード uu に左の子が存在しなかった場合
  3. 種類 44 のクエリにおいて、値が vv であるようなノード uu に右の子が存在しなかった場合

部分点

この問題には部分点が設定されている。

  • 1Q1,0001≦Q≦1,000 を満たすようなデータセットに正解した場合 2020 点が与えられる。
  • 1ti2(1iQ)1≦t_i≦2(1≦i≦Q) を満たすようなデータセットに正解した場合上記の部分点とは別に 3030 点が与えられる。
  • 追加制約のないデータセットに正解した場合さらに 100100 点が得られ合計 150150 点が得られる。

入力例 1

13
1 4
1 2
1 1
1 3
1 6
1 5
1 7
1 8
2 1
2 2
2 4
2 6
2 7

出力例 1

0
0
-1
-1
-1
  • 11 番目から 88 番目までのクエリにおいて TT にノードをクエリで与えられた順序に従って挿入します。挿入の際、回転操作は行われないことに注意してください。
  • 以下の図に 88 番目のクエリが行われた後の TT を示します。
  • ノード内に書かれた値は、ノードが持つ値を、ノードの横に書かれた値はそのノードを根とする部分木の高さを示します。
  • 与えられたクエリによって TT の形状は一意に定まることが保証されます。
  • 99 番目のクエリにおいて、値が 11 であるようなノードの左部分木の高さ h(lst)h(lst) と右部分木の高さ h(rst)h(rst) はともに 00 なので h(lst)h(rst)h(lst)-h(rst)00 です。
  • 1010 番目のクエリにおいて、 h(lst)h(lst)h(rst)h(rst) はともに 11 なので h(lst)h(rst)h(lst)-h(rst)00 です。
  • 1111 番目のクエリにおいて、 h(lst)h(lst)22h(rst)h(rst)33 なので h(lst)h(rst)h(lst)-h(rst)\-1\-1 です。
  • 1212 番目のクエリにおいて、 h(lst)h(lst)11h(rst)h(rst)22 なので h(lst)h(rst)h(lst)-h(rst)\-1\-1 です。
  • 1313 番目のクエリにおいて、 h(lst)h(lst)00h(rst)h(rst)11 なので h(lst)h(rst)h(lst)-h(rst)\-1\-1 です。
  • 子が存在しないような部分木の高さは 00 となることに注意してください。
  • このケースは 22 つの部分点制約の両方の部分点制約を満たします。

11 : 88 番目のクエリ終了時点での TT の様子


入力例 2

14
1 4
1 2
1 1
1 3
1 6
1 5
1 7
1 8
3 4
2 2
2 4
2 6
2 7
3 7

出力例 2

-3
-2
-1
-1
-1
  • 以下の図に 99 番目のクエリにより右回転が行われる前の TT を左に、回転後の TT を右に示します。
  • ノード同士の位置関係の変化に注意してください。
  • 1414 番目のクエリにおいて、 値が 77 であるようなノードに左の子は存在しないため、-1を出力してください。
  • 与えられたクエリによって TT の形状は一意に定まることが保証されます。
  • このケースは 11 つ目の部分点制約を満たします。

22 : 99 番目のクエリによる TT の変形の様子


入力例 3

14
1 4
1 2
1 1
1 3
1 6
1 5
1 7
1 8
4 6
2 2
2 4
2 6
2 7
4 6

出力例 3

0
-1
1
1
-1
  • 以下の図に 99 番目のクエリにより左回転が行われる前の TT を左に、回転後の TT を右に示します。
  • ノード同士の位置関係の変化に注意してください。
  • 1414 番目のクエリにおいて、 値が 66 であるようなノードに右の子は存在しないため、-1を出力してください。
  • 与えられたクエリによって TT の形状は一意に定まることが保証されます。
  • このケースは 11 つ目の部分点制約を満たします。

33 : 99 番目のクエリによる TT の変形の様子