#200. 三值排序(区间查询)

三值排序(区间查询)

【题目描述】

小灰灰有一个长度为 nn 的序列:a1,a2,,ana_1, a_2, \dots, a_n

这个序列中仅有数字 1、2 和 3,也就是说对于任意的 aia_i 均有 ai{1,2,3}a_i \in \{1, 2, 3\}

小蓝对这个序列提出了 mm 个询问,第 ii 个询问,指定了一个区间 [li,ri][l_i, r_i],她想知道需要执行下面的操作至少多少次才能把区间中元素从小到大排好序。

  • 一次操作是指,选择区间 [li,ri][l_i, r_i] 的两个不同数字,然后交换这两个数字的位置。

这里的所有询问均独立,也就是说每次小蓝只是提出问题,你做出回答(如果修改,需要至少多少次操作),并没有真的修改 aa 序列。


【输入描述】

第一行输入两个整数 nnmm

接下来一行输入 nn 个整数,其中第 ii 个整数表示 aia_i

接下来 mm 行,第 ii 行输入两个整数 lil_irir_i

保证:

  • 1n,m3×1051 \le n, m \le 3 \times 10^5
  • ai{1,2,3}a_i \in \{1, 2, 3\}
  • 1lirin1 \le l_i \le r_i \le n

【输出描述】

输出共 mm 行,第 ii 行输出将区间 [li,ri][l_i, r_i] 排序所需的最少交换次数。


【样例 1】

【样例 1 输入】

9 5
2 2 1 3 3 3 2 3 1
1 9
2 7
4 6
1 3
7 9

【样例 1 输出】

4
2
0
1
2

【样例 1 解释】

  • 查询 [1,9][1,9](对应子数组 2 2 1 3 3 3 2 3 1):
    1. 交换 a1a_1a3a_3 \rightarrow 1 2 2 3 3 3 2 3 1
    2. 交换 a2a_2a9a_9 \rightarrow 1 1 2 3 3 3 2 3 2
    3. 交换 a4a_4a7a_7 \rightarrow 1 1 2 2 3 3 3 3 2
    4. 交换 a5a_5a9a_9 \rightarrow 1 1 2 2 2 3 3 3 3 共 4 次交换。
  • 查询 [2,7][2,7](对应子数组 2 1 3 3 3 2):
    1. 交换子数组中的位置 1 和 2(即原序列位置 2 和 3) \rightarrow 1 2 3 3 3 2
    2. 交换子数组中的位置 3 和 6(即原序列位置 4 和 7) \rightarrow 1 2 2 3 3 3 共 2 次交换。
  • 查询 [4,6][4,6](对应子数组 3 3 3):已排序,0 次交换。
  • 查询 [1,3][1,3](对应子数组 2 2 1):
    1. 交换位置 1 和 3 \rightarrow 1 2 2 共 1 次交换。
  • 查询 [7,9][7,9](对应子数组 2 3 1):
    1. 交换子数组中的位置 1 和 3(即原序列位置 7 和 9) \rightarrow 1 3 2
    2. 交换子数组中的位置 2 和 3(即原序列位置 8 和 9) \rightarrow 1 2 3 共 2 次交换。

【样例 2】

【样例 2 输入】

10 3
1 3 2 1 3 2 1 3 2 3
1 10
3 8
2 7

【样例 2 输出】

3
2
3

【样例 2 解释】

  • 查询 [1,10][1,10](对应子数组 1 3 2 1 3 2 1 3 2 3):
    1. 交换 a3a_3a4a_4 \rightarrow 1 3 1 2 3 2 1 3 2 3
    2. 交换 a2a_2a7a_7 \rightarrow 1 1 1 2 3 2 3 3 2 3
    3. 交换 a5a_5a9a_9 \rightarrow 1 1 1 2 2 2 3 3 3 3 共 3 次交换。
  • 查询 [3,8][3,8](对应子数组 2 1 3 2 1 3):
    1. 交换子数组中的位置 1 和 5(即原序列位置 3 和 7) \rightarrow 1 1 3 2 2 3
    2. 交换子数组中的位置 3 和 5(即原序列位置 5 和 7) \rightarrow 1 1 2 2 3 3 共 2 次交换。
  • 查询 [2,7][2,7](对应子数组 3 2 1 3 2 1):
    1. 交换子数组中的位置 1 和 6(即原序列位置 2 和 7) \rightarrow 1 2 1 3 2 3
    2. 交换子数组中的位置 2 和 3(即原序列位置 3 和 4) \rightarrow 1 1 2 3 2 3
    3. 交换子数组中的位置 4 和 5(即原序列位置 5 和 6) \rightarrow 1 1 2 2 3 3 共 3 次交换。

【样例 3】

【样例 3 输入】

8 3
1 2 2 1 1 2 1 2
1 8
2 7
4 8

【样例 3 输出】

2
2
1

【样例 3 解释】

  • 查询 [1,8][1,8](对应子数组 1 2 2 1 1 2 1 2):
    1. 交换 a2a_2a5a_5 \rightarrow 1 1 2 1 2 2 1 2
    2. 交换 a3a_3a7a_7 \rightarrow 1 1 1 1 2 2 2 2 共 2 次交换。
  • 查询 [2,7][2,7](对应子数组 2 2 1 1 2 1):
    1. 交换子数组中的位置 1 和 4(即原序列位置 2 和 5) \rightarrow 1 2 1 2 2 1
    2. 交换子数组中的位置 2 和 6(即原序列位置 3 和 7) \rightarrow 1 1 1 2 2 2 共 2 次交换。
  • 查询 [4,8][4,8](对应子数组 1 1 2 1 2):
    1. 交换子数组中的位置 3 和 4(即原序列位置 6 和 7) \rightarrow 1 1 1 2 2 共 1 次交换。

【数据规模与约定】

测试点编号 分数 特殊性质 A 特殊性质 B
1 ~ 3 15 n,m500n,m \le 500 保证序列中只有 1 和 2
4 ~ 8 25
9 ~ 13 25· n,m500n,m \le 500
14 ~ 18 35