#3821. SP1684-Frequent values-RMQ
SP1684-Frequent values-RMQ
题目描述
给定一个长度为 n 的整数序列 a1, a2, …, an,且该序列已经按非降序排列(即每一个元素都不大于它后面的元素)。接下来有若干个查询,每个查询给出左右端点 i 和 j(1 ≤ i ≤ j ≤ n)。对于每个查询,在子区间 a[i], a[i+1], …, a[j] 中,找出出现次数最多的那个数,输出该数在本区间中出现的次数。
注意:如果你直接用简单的 O(n) 方法或者把子区间取出再排序、统计,最坏情况下会超时,需要用更快的算法。
输入格式
-
输入由若干测试用例组成,每个测试用例格式如下:
- 一行两个整数 n 和 q,表示序列长度和查询次数,满足 1 ≤ n, q ≤ 100000。
- 一行 n 个整数 a1, a2, …, an,范围在 –100000 到 100000 之间,并且保证 a1 ≤ a2 ≤ … ≤ an。
- 接下来 q 行,每行两个整数 i 和 j,表示查询区间的左右端点(1 ≤ i ≤ j ≤ n)。
-
最后会出现一行单独的“0”,表示所有测试用例结束,无需再处理。
输出格式
- 对每个查询,输出一行一个整数,表示该区间内出现次数最多的值的出现次数。
样例
输入:
10 3
-1 -1 1 1 1 1 3 10 10 10
2 3
1 10
5 10
0
输出:
1
4
3
样例说明
- 查询区间 [2,3] 即序列 –1, 1,两者都只出现一次,最多次数为 1。
- 查询区间 [1,10] 整段中,数字 1 出现了 4 次,是最多的。
- 查询区间 [5,10] 即序列 1,1,3,10,10,10,数字 10 出现了 3 次,是最多的。