CodeForces - 221D Little Elephant and Array(区间前缀和)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 221D Little Elephant and Array(区间前缀和)相关的知识,希望对你有一定的参考价值。


Description:

The Little Elephant loves playing with arrays. He has array a, consisting of npositive integers, indexed from 1 to n. Lets denote the number with index i as ai.

Additionally the Little Elephant has m queries to the array, each query is characterised by a pair of integers lj and rj (1 ≤ lj ≤ rj ≤ n). For each query lj, rj the Little Elephant has to count, how many numbers x exist, such that number x occurs exactly x times among numbers alj, alj + 1, ..., arj.

Help the Little Elephant to count the answers to all queries.

Input

The first line contains two space-separated integers n and m (1 ≤ n, m ≤ 105) — the size of array a and the number of queries to it. The next line contains nspace-separated positive integers a1, a2, ..., an (1 ≤ ai ≤ 109). Next m lines contain descriptions of queries, one per line. The j-th of these lines contains the description of the j-th query as two space-separated integers lj and rj (1 ≤ lj ≤ rj ≤ n).

Output

In m lines print m integers — the answers to the queries. The j-th line should contain the answer to the j-th query.

Examples

Input


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


Output


3 1


这道题做题做了好久也没做出来,然后看题解是莫队,还有这一种特别巧妙的前缀和求法,现在才看懂。就是利用前缀和求1-n中每个数出现了几次,每次询问进行技术操作。

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include <queue>
#include <vector>
#include<map>
const int INF = 0x3f3f3f3f;
using namespace std;
typedef long long ll;
#define mn 1000010
int i,j,k;
int n,m;
int c,d;
int cnt;
int l[mn],r[mn],ans[mn],a[mn],s[mn],b[mn];
int main()

cin>>n>>m;
for(int i=1; i<=n; i++)

cin>>a[i];
b[a[i]<=n?a[i]:0]++;

//b数组只是为了作为判断的一个条件,
//只需要判断到n是因为只有n个数,这个数大于n肯定无法满足次数和数值相等
for(int i=1; i<=m; i++)
cin>>l[i]>>r[i];
for(int i=1; i<=n; i++)
if(i<=b[i])//如果这个数的值大于他出现的次数就没必要操作

for(int j=1; j<=n; j++)
s[j]=s[j-1]+(a[j]==i);//这一步是求前面相同的数有多少个
for(int j=1; j<=m; j++)
if(s[r[j]]-s[l[j]-1]==i)
ans[j]++;//遍历1-n,每次循环,有多少满足的就计数+1.

for(int i=1; i<=m; i++)
cout<<ans[i]<<endl;
return 0;

 

以上是关于CodeForces - 221D Little Elephant and Array(区间前缀和)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 220B - Little Elephant and Array 离线树状数组

[CodeForces-259C] Little Elephant and Bits

『题解』Codeforces220B Little Elephant and Array

Little Girl and Maximum XOR CodeForces - 276D

Little Girl and Maximum Sum CodeForces - 276C

CodeForces - 258D Little Elephant and Broken Sorting