#P6186. [NOI Online #1 提高组] 冒泡排序

[NOI Online #1 提高组] 冒泡排序

题目描述

给定一个 1∼n1 ∼ n 的排列 pip_i,接下来有 mm 次操作,操作共两种:

  1. 交换操作:给定 xx,将当前排列中的第 xx 个数与第 x+1x+1 个数交换位置。
  2. 询问操作:给定 kk,请你求出当前排列经过 kk 轮冒泡排序后的逆序对个数。 对一个长度为 nn 的排列 pip_i 进行一轮冒泡排序的伪代码如下:
for i = 1 to n-1:
  if p[i] > p[i + 1]:
    swap(p[i], p[i + 1])

输入格式

第一行两个整数 nn,mm,表示排列长度与操作个数。

第二行 nn 个整数表示排列 pip_i。

接下来 mm 行每行两个整数 tit_i,cic_i,描述一次操作:

  • 若 ti=1t_i=1,则本次操作是交换操作,x=cix=c_i;
  • 若 ti=2t_i=2,则本次操作是询问操作,k=cik=c_i。

输出格式

对于每次询问操作输出一行一个整数表示答案。

3 6
1 2 3
2 0
1 1
1 2
2 0
2 1
2 2
0
2
1
0

提示

样例一解释

第一次操作:排列为 {1,2,3}\{1,2,3\},经过 0 轮冒泡排序后为 {1,2,3}\{1,2,3\},00 个逆序对。

第二次操作:排列变为 {2,1,3}\{2,1,3\}。

第三次操作:排列变为 {2,3,1}\{2,3,1\}。

第四次操作:经过 00 轮冒泡排序后排列变为 {2,3,1}\{2,3,1\},22 个逆序对。

第五次操作:经过 11 轮冒泡排序后排列变为 {2,1,3}\{2,1,3\},11 个逆序对。

第六次操作:经过 22 轮冒泡排序后排列变为 {1,2,3}\{1,2,3\},00 个逆序对。


数据范围与提示

对于测试点 1∼21 ∼ 2:n,m≤100n,m \leq 100。

对于测试点 3∼43 ∼ 4:n,m≤2000n,m \leq 2000。

对于测试点 5∼65 ∼ 6:交换操作个数不超过 100100。

对于所有测试点:2≤n,m≤2×1052 \leq n,m \leq 2 \times 10^5,ti∈{1,2}t_i \in \{1,2\},1≤x<n1 \leq x < n,0≤k<2310 \leq k < 2^{31}。