CF220B 莫队求助
  • 板块学术版
  • 楼主T20201126
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/9/3 13:17
  • 上次更新2023/10/27 12:43:43
查看原帖
CF220B 莫队求助
419474
T20201126楼主2022/9/3 13:17
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const ll N=100005;
inline ll read();
ll n,m,a[N],num[N],pos[N],l,r,res,cnt;
struct node {
	ll l,r,ID,ans;
}q[N];
bool cmp(node x,node y){
	return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];
}
bool cmp1(node x,node y)
{
	return x.ID<y.ID;
}
void add(int w)
{
	if(a[w]>n) return ;
	++num[a[w]];
	if(num[a[w]]==a[w]) ++res;
	if(num[a[w]]==a[w]+1) --res;
	return ;
}
void sub(int w)
{
	if(a[w]>n) return ;
	--num[a[w]];
	if(num[a[w]]==a[w]) ++res;
	if(num[a[w]]==a[w]-1) --res;
	return ;
}
int main()
{
	n=read();m=read();cnt=sqrt(n);
	for(int i=1;i<=n;++i)
		a[i]=read(),pos[i]=1+(i-1)/cnt;
	for(int i=1;i<=m;++i){
		q[i].l=read();q[i].r=read();
		q[i].ID=i;
	}	
	sort(q+1,q+1+n,cmp);
	l=1;r=0;res=0;
	for(int i=1;i<=m;++i)
	{
		while(q[i].l<l) add(--l);
		while(q[i].r>r) add(++r);
		while(q[i].l>l) sub(l++);
		while(q[i].r<r) sub(r--);
		q[i].ans=res;
	}
	sort(q+1,q+1+m,cmp1);
	for(int i=1;i<=m;++i)
		printf("%lld\n",q[i].ans);
	return 0;
}
inline ll read(){
	ll x=0;int b=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') b=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
	return x*b;
}
2022/9/3 13:17
加载中...