#P14574. [IATI 2025 Day 1]self_describing

[IATI 2025 Day 1]self_describing

题目描述

定义一个数组 b0,b1,,bM1b_0,b_1,\dots,b_{M-1}自描述数组,当且仅当对于数组中的每个元素 bib_i,数值 bib_i 在整个数组中恰好出现 bib_i

例如:

  • [1, 2, 2] 是自描述数组;
  • [5, 5, 5, 5, 5] 是自描述数组;
  • [3, 1, 3, 2, 3, 2] 是自描述数组;

而下面这些不是:

  • [100, 1, 2, 2] 不是,因为 100 只出现了 1 次;
  • [1, 1, 1, 1, 1] 不是,因为 1 出现了 5 次。

进一步地,若数组 bl,bl+1,,brb_l,b_{l+1},\dots,b_r 本身是自描述数组,则称它为一个自描述子数组

给定一个数组 a0,a1,,aN1a_0,a_1,\dots,a_{N-1},以及 QQ 次询问 (l,r)(l,r)(满足 lrl \le r)。

对于每次询问,你需要求出有多少个子数组 (l,r)(l',r') 满足:

  • llrrl \le l' \le r' \le r
  • 子数组 al,al+1,,ara_{l'}, a_{l'+1}, \dots, a_{r'} 是自描述子数组。

实现方式

你需要实现以下两个过程:

初始化

void init(int N, int Q, const std::vector<int>& a)

该函数在每个测试点中只会被调用一次,传入原数组 aa

单次询问

long long query(int l, int r)

该函数会被调用 QQ 次,每次对应一个区间询问 (l,r)(l,r),你需要返回答案。

本地测试

本地 grader 会按如下格式读入数据:

  1. N,QN,Q
  2. 数组 a0,a1,,aN1a_0,a_1,\dots,a_{N-1}
  3. 接下来 QQ 行,每行一个询问 (l,r)(l,r)

然后它会先调用 init,再依次调用 query 并输出答案。

你可以自由修改本地 grader

数据范围

  • 1N,Q3×1051 \le N, Q \le 3 \times 10^5
  • 1aiN1 \le a_i \le N
  • 0lrN10 \le l \le r \le N-1

样例

输入

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

输出

3
2
5

子任务

子任务 分值 依赖子任务 NN QQ 其他限制
0 - - 样例
1 6 500\le 500 =1=1
2 1 5000\le 5000 唯一询问是 [1,N][1,N]
3 39 1–2 3×105\le 3\times 10^5
4 11 0–3 500\le 500
5 16 0–4 5×104\le 5\times 10^4
6 22 0–5 5×105\le 5\times 10^5

只有通过某个子任务及其依赖的全部测试,才能获得该子任务分数。