AT_tkppc3_h 新入生歓迎数列 - Hard
Description
[problemUrl]: https://atcoder.jp/contests/tkppc3/tasks/tkppc3_h
配点: $ 1000 $ 点
パ研の新入生の PAKEN 君は, 長さ $ N $ の数列 $ P\ = ${$ P_1,\ P_2,\ P_3,\ ...,\ P_N $} を E869120 からもらった. **最初 $ P $ のすべての要素は $ 0 $ である.**
PAKEN 君は, 数列 $ P $ に以下の操作を好きな順番で, 合計で $ 550\ 000 $ 回以内行うことによって, この数列を $ A\ = ${$ A_1,\ A_2,\ A_3,\ ...,\ A_N $} と同じにしようと思った.
- 操作 1: $ 1 $ 以上 $ N $ 以下の整数 $ x $ を選び, $ P_x $ の値を $ 1 $ に変更する.
- 操作 2: $ 1 $ 以上 $ N $ 以下の整数 $ y,\ z $ を選び, $ P_y $ の値に $ P_z $ の値を足す. ただし, $ y\ =\ z $ であってもよい. **また, $ P_y $ の値は $ 10^{18} $ を超えてはならない.**
PAKEN 君はまだ幼いので, どのような手順で操作をすればよいのか分からない. 彼を助けるために, あなたは操作の手順の一例を示さなければならない.
Input Format
入力は, 以下の形式で標準入力から与えられる.
> $ N $ $ A_1 $ $ A_2 $ $ A_3 $ ... $ A_N $
Output Format
出力は, 以下の形式で標準出力から行うこと.
> $ Q $ ($ 1 $ 回目の操作の情報) ($ 2 $ 回目の操作の情報) ($ 3 $ 回目の操作の情報) ... ($ Q $ 回目の操作の情報)
まず最初に, 行う操作の回数 $ Q $ を出力しなければならない. **$ Q $ は $ 0 $ 以上 $ 550\ 000 $ 以下の整数でなければならない.** 次の $ Q $ 行, 各回の操作の情報は, 以下のように出力しなければならない.
(☆) 操作 1 を行う場合
> $ 1 $ $ x $
これは, $ P_x $ を $ 1 $ にするという操作を行う, という意味である.
(★) 操作 2 を行う場合
> $ 2 $ $ y $ $ z $
これは, $ P_y $ に $ P_z $ の値を足すという操作を行う, という意味である.
Explanation/Hint
### 制約
- $ N $ は $ 2 $ 以上 $ 200\ 000 $ 以下の整数である.
- $ A_1\ =\ 1 $ を満たす.
- $ A_i $ $ (1\ \leq\ i\ \leq\ N) $ は $ 1 $ 以上 $ 2^{30}\ -\ 1 $ 以下の整数である.
### 小課題
小課題1 \[ $ 60 $点 \]
- $ N\ =\ 2 $ を満たす.
小課題2 \[ $ 140 $点 \]
- $ N\ \leq\ 8\ 000 $ を満たす.
小課題3 \[ $ 80 $点 \]
- $ N\ \leq\ 16\ 000 $ を満たす.
小課題4 \[ $ 230 $点 \]
- $ N\ \leq\ 25\ 000 $ を満たす.
小課題5 \[ $ 270 $点 \]
- $ N\ \leq\ 160\ 000 $ を満たす.
小課題6 \[ $ 220 $点 \]
追加の制約はない.