莫队极简代码求调
查看原帖
莫队极简代码求调
471571
封禁用户楼主2023/8/31 19:37

只对了前4个点

#include<bits/stdc++.h>
#define M 200001
#define N 200000001
#define inf 0x3f3f3f3f
#define ls p<<1
#define rs p<<1|1
#define ll long long
using namespace std;
inline ll read()
{
	ll k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
ll n,m,x,block,a[M];
ll s[N],ans[M],res;
struct node
{
	ll l,r,idx;
}w[M];
bool cmp(node x,node y)
{
	if(x.l/block==y.l/block) return x.r<y.r;
	else return x.l/block<y.l/block;
}
void add(ll k)
{
	if(s[k^x]) res++;
	s[k]++;
}
void del(ll k)
{
	s[k]--;
	if(s[k^x]) res--;
}
int main()
{
	n=read(),m=read(),x=read(),block=pow(n,0.5);
	for(ll i=1;i<=n;i++) a[i]=read();
	for(ll i=1;i<=m;i++) w[i].l=read(),w[i].r=read(),w[i].idx=i;
	sort(w+1,w+m+1,cmp);
//	for(ll i=1;i<=m;i++) printf("%d %d\n",w[i].l,w[i].r);
	ll l=1,r=0;
	for(ll i=1;i<=m;i++)
	{
		while(l>w[i].l) add(a[--l]);
		while(r<w[i].r) add(a[++r]);
		while(l<w[i].l) del(a[l++]);
		while(r>w[i].r) del(a[r--]);
		ans[w[i].idx]=res;
	}
	for(ll i=1;i<=m;i++)
	{
		if(ans[i]==0) printf("no\n");
		else printf("yes\n");
	}
	return 0;
}
2023/8/31 19:37
加载中...