给出一个序列,每次询问区间内出现次数恰好是k的元素个数。
//c[maxn]维护出现i次的数有多少 //cc[maxn]维护第i个数出现多少次 //然后莫队 #include<bits/stdc++.h> using namespace std; const int maxn=4e4+100; int c[maxn],cc[maxn]; int belong[maxn]; int sz,bnum; struct node { int l,r,k,id; bool operator < (const node &b) const { return (belong[l]^belong[b.l])?belong[l]<belong[b.l]:((belong[l]&1)?r<b.r:r>b.r); } }q[maxn]; int n,m,a[maxn],ans[maxn]; int main () { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",a+i),cc[a[i]]++; int l=1,r=n; sz=sqrt(n); bnum=n/sz+(n%sz>0); for (int i=1;i<=bnum;i++) { for (int j=(i-1)*sz+1;j<=i*sz;j++) { belong[j]=i; } } for (int i=0;i<=4e4;i++) { c[cc[i]]++; } for (int i=1;i<=m;i++) { scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k); q[i].id=i; } sort(q+1,q+m+1); for (int i=1;i<=m;i++) { while (l<q[i].l) { c[cc[a[l]]]--; cc[a[l]]--; c[cc[a[l]]]++; l++; } while (l>q[i].l) { l--; c[cc[a[l]]]--; cc[a[l]]++; c[cc[a[l]]]++; } while (r<q[i].r) { r++; c[cc[a[r]]]--; cc[a[r]]++; c[cc[a[r]]]++; } while (r>q[i].r) { c[cc[a[r]]]--; cc[a[r]]--; c[cc[a[r]]]++; r--; } ans[q[i].id]=c[q[i].k]; } for (int i=1;i<=m;i++) printf("%d\n",ans[i]); }