B. Little Elephant and Array
(莫队板子)
题意:在区间[l, r] 中有多少个数x ,其出现次数也为x
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10 ;
int a[N] , cnt[N];
int ans[N];
int n , q ;
int res = 0 ;
struct node {
int id, l, r;
}all[N] ;
int len ;
bool cmp(node a, node b) {
if(a.l / len != b.l / len) return a.l < b.l;
else return a.r < b.r;
}
void add(int id ) {
if(id > n) return;
if(cnt[id] == id) res --;
cnt[id] ++;
if(cnt[id] == id) res ++;
}
void del(int id ) {
if(id > n) return ;
if(cnt[id] == id) res --;
cnt[id] --;
if(cnt[id] == id) res ++;
}
int main(){
cin>>n>>q ;
len = sqrt(n) ;
for(int i = 1; i <= n; i ++) cin>>a[i] ;
for(int i = 1; i <= q; i ++) {
int l, r ;
cin>>l>>r ;
all[i] ={i, l, r} ;
}
sort(all + 1, all + q + 1, cmp) ;
int ll = 1 , rr =0 ;
for(int i = 1; i <= q; i ++) {
int id = all[i].id , l = all[i].l , r = all[i].r ;
while(ll > l) add(a[-- ll]);
while(ll < l) del(a[ll ++]);
while(rr > r) del(a[rr --]);
while(rr < r) add(a[++ rr]);
ans[id] = res ;
}
for(int i = 1; i <= q; i ++) cout<<ans[i] <<"\n";
return 0 ;
}