#ijpctraining. [ijpc_training]魔法の訓練 (Magical Training)

[ijpc_training]魔法の訓練 (Magical Training)

题目描述

いもす是14岁时就进行了魔法觉醒的魔法少女。

いもす为了打倒161天以后即将来临的强敌「ウォーターリークス」,开始进行提高魔力的训练。这个训练是这样的:

一开始,有NN个魔力值已给出的魔法石排成一列。

现在选择连续的一些魔法石,将它们按照魔力值从小到大排序,也就是说,将魔力值小的魔法石放在较小的编号上这样的训练,可以提高いもす的魔力。每一块魔法石都很重,所以排序的时候只能用魔法交换相邻的两块魔法石。

但是,魔法石有很多,交换魔法石的顺序是相当艰难的。又因为交换的方案有很多,所以いもす选择的是最轻松的方案。而且,魔法石的魔力值会在某些时间点突然发生变化。十分幸运的是,这些变化已经全部被预测了。

为了帮助いもす的魔法训练,请你写一个程序支持如下操作:

题目将给出一个包含NN个整数的排列A(A0AN1)A(A_0…A_{N-1}),其中从左往右第i+1i+1个魔法石的编号为iiAiA_i表示ii号魔法石的魔力值。

要实现的操作如下:

  • 含有参数的过程init(N,A)init(N,A):
    • NN——魔法石的个数。魔法石的编号从左至右依次为0...N10...N-1
    • AA——表示魔法值的整数的序列。保证对0i<N0\le i< N1AiN1\le A_i\le N

           这个过程只在update和train之前出现一次,没有返回值。

  • 含有参数的过程update(i,x)update(i,x):
    • ii——魔力值变动的魔法石编号
    • xx——魔力变动后魔法石ii的魔力值。保证1xN1\le x\le N

           这个过程被多次调用,一次调用对应一次魔力值的变化,没有返回值。

  • 含有参数的过程train(p,q)train(p,q):
    • pp——选择的魔法石序列的左端魔法石编号。保证1p<N1\le p< N
    • qq——选择的魔法石序列的右端魔法石编号。保证pq<Np\le q< N

           这个过程被多次调用,一次调用对应从魔法石pp到魔法石qq(两端也包含),通过更换相邻的魔法石,达到升序排列的训练。需要返回作为对应的训练所需的最小的魔法石交换次数。但是,实际不进行魔法石的交换,只要求交换的次数。

举个例子

N=6N=6时,AA(4,1,2,2,6,5)(4,1,2,2,6,5)时,进行如下的77次操作

操作 输出
train(0,5)train(0, 5) 44
train(2,3)train(2, 3) 00
update(1,5)update(1, 5)
train(0,5)train(0, 5) 55
train(1,4)train(1, 4) 22
update(5,1)update(5, 1)
train(0,5)train(0, 5) 99

数据规模

updateupdatetraintrain的调用次数为P,QP,Q

部分1(12分)

1N1001\le N\le 100

1P+Q2001\le P+Q\le 200

部分2(18分)

1N50001\le N\le 5000

1P+Q100001\le P+Q\le 10000

部分3(30分)

1N300001\le N\le 30000

P=0P=0

1Q200001\le Q\le 20000

部分4(40分)

1N300001\le N\le 30000

1P+Q200001\le P+Q\le 20000

输入输出格式

输入格式:

第一行包含一个数NN,表示魔法石总数。

第二行包含NN个整数A0...AN1A_0...A_{N-1},表示魔法石的魔法值。

第三行包含一个数MM,表示操作个数。

接下来的MM行,每行有三个整数Ti,Xi,YiT_i,X_i,Y_iTi=0T_i=0时调用update(Xi,Yi)update(X_i,Y_i)Ti=1T_i=1时调用train(Xi,Yi)train(X_i,Y_i)

输出格式:

对于每一个traintrain操作,输出一行,包含一个数,为最少交换次数。

输入输出样例

输入样例#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