莫队算法应用
这题代码主要是作为模板保存
#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int maxn = 1<<20;
long long a[maxn],ans[maxn],n,m,k;
struct node{
int l,r,id;
}ask[maxn];
int belong[maxn],L=1,R=0;
long long tmp=0;
long long cnt[maxn];
bool cmp(node c, node d){
if(belong[c.l]!=belong[d.l])
return belong[c.l]<belong[d.l];
return c.r<d.r;
}
void add(int x){
tmp+=(cnt[a[x]^k]);
cnt[a[x]]++;
}
void del(int x){
cnt[a[x]]--;
tmp-=(cnt[a[x]^k]);
}
int main(){
scanf("%I64d%I64d%I64d",&n,&m,&k);
int block = sqrt(2*n);
for(int i=1;i<=n;i++){
scanf("%I64d",&a[i]);
a[i]^=a[i-1];
belong[i]=i/block;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&ask[i].l,&ask[i].r);
ask[i].id=i;
}
cnt[0]=1;
sort(ask+1,ask+1+m,cmp);
for(int i=1;i<=m;i++){
while(L<ask[i].l){
del(L-1);
L++;
}
while(L>ask[i].l){
L--;
add(L-1);
}
while(R<ask[i].r){
R++;
add(R);
}
while(R>ask[i].r){
del(R);
R--;
}
ans[ask[i].id] = tmp;
}
for(int i=1;i<=m;i++){
printf("%I64d\n",ans[i]);
}
return 0;
}