B. Little Elephant and Array
time limit per test4 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
The Little Elephant loves playing with arrays. He has array a, consisting of n positive integers, indexed from 1 to n. Let’s 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 n space-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
inputCopy
7 2
3 1 2 2 3 3 7
1 7
3 4
outputCopy
3
1
在csdn上看的题解是莫队算法,现在还没学,但是找到了一种不用莫队算法的解法
主要思想是求某个数在0-i区间上出现的次数,通过做差求某个区间上某个数出现的次数、
做的时候注意剪枝
#include <iostream>
#define mn 1000010
using namespace std;
int n,m,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]++;
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]++;
}
for(int i=1; i<=m; i++)
cout<<ans[i]<<endl;
}