AT_ijpc_training 魔法の訓練 (Magical Training)
题目描述
いもす是14岁时就进行了魔法觉醒的魔法少女。
いもす为了打倒161天以后即将来临的强敌「ウォーターリークス」,开始进行提高魔力的训练。这个训练是这样的:
一开始,有$N$个魔力值已给出的魔法石排成一列。
现在选择连续的一些魔法石,将它们按照魔力值从小到大排序,也就是说,将魔力值小的魔法石放在较小的编号上这样的训练,可以提高いもす的魔力。每一块魔法石都很重,所以排序的时候只能用魔法交换相邻的两块魔法石。
但是,魔法石有很多,交换魔法石的顺序是相当艰难的。又因为交换的方案有很多,所以いもす选择的是最轻松的方案。而且,魔法石的魔力值会在某些时间点突然发生变化。十分幸运的是,这些变化已经全部被预测了。
为了帮助いもす的魔法训练,请你写一个程序支持如下操作:
题目将给出一个包含$N$个整数的排列$A(A_0…A_{N-1})$,其中从左往右第$i+1$个魔法石的编号为$i$,$A_i$表示$i$号魔法石的魔力值。
要实现的操作如下:
+ 含有参数的过程$init(N,A)$:
+ $N$——魔法石的个数。魔法石的编号从左至右依次为$0...N-1$
+ $A$——表示魔法值的整数的序列。保证对$0\le i< N$有$1\le A_i\le N$
这个过程只在update和train之前出现一次,没有返回值。
+ 含有参数的过程$update(i,x)$:
+ $i$——魔力值变动的魔法石编号
+ $x$——魔力变动后魔法石$i$的魔力值。保证$1\le x\le N$
这个过程被多次调用,一次调用对应一次魔力值的变化,没有返回值。
+ 含有参数的过程$train(p,q)$:
+ $p$——选择的魔法石序列的左端魔法石编号。保证$1\le p< N$
+ $q$——选择的魔法石序列的右端魔法石编号。保证$p\le q< N$
这个过程被多次调用,一次调用对应从魔法石$p$到魔法石$q$(两端也包含),通过更换相邻的魔法石,达到升序排列的训练。需要返回作为对应的训练所需的最小的魔法石交换次数。但是,实际不进行魔法石的交换,只要求交换的次数。
#### 举个例子
当$N=6$时,$A$为$(4,1,2,2,6,5)$时,进行如下的$7$次操作
|操作 | 输出 |
| :----------- | :----------- |
| $train(0, 5)$ | $4$ |
| $train(2, 3)$ | $0$ |
| $update(1, 5)$ | 无 |
| $train(0, 5)$ | $5$ |
| $train(1, 4)$ | $2$ |
| $update(5, 1)$ | 无 |
| $train(0, 5)$ | $9$ |
## 数据规模
设$update$和$train$的调用次数为$P,Q$
### 部分1(12分)
$1\le N\le 100$
$1\le P+Q\le 200$
### 部分2(18分)
$1\le N\le 5000$
$1\le P+Q\le 10000$
### 部分3(30分)
$1\le N\le 30000$
$P=0$
$1\le Q\le 20000$
### 部分4(40分)
$1\le N\le 30000$
$1\le P+Q\le 20000$
输入格式
第一行包含一个数$N$,表示魔法石总数。
第二行包含$N$个整数$A_0...A_{N-1}$,表示魔法石的魔法值。
第三行包含一个数$M$,表示操作个数。
接下来的$M$行,每行有三个整数$T_i,X_i,Y_i$。$T_i=0$时调用$update(X_i,Y_i)$,$T_i=1$时调用$train(X_i,Y_i)$。
输出格式
对于每一个$train$操作,输出一行,包含一个数,为最少交换次数。
## 输入输出样例
### 输入样例#1
6
4 1 2 2 6 5
7
1 0 5
1 2 3
0 1 5
1 0 5
1 1 4
0 5 1
1 0 5
### 输出样例#1
4
0
5
2
9