E - XOR and Favorite Number【莫队】
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
const int maxn=1<<20;
ll cnt[maxn];
ll ans[maxn];
ll Ans;
int pos[maxn];
int pr[maxn];
int L=1,R=0;
int n,m,k;
struct node
{
int l,r,id;
}Q[maxn];
bool cmp(node p,node q)
{
if(pos[p.l]==pos[q.l]) return p.r<q.r;
return pos[p.l]<pos[q.l];
}
void del(int x)
{
cnt[pr[x]]--;
Ans-=cnt[pr[x]^k];
}
void add(int x)
{
Ans+=cnt[pr[x]^k];
cnt[pr[x]]++;
}
int main()
{
cin>>n>>m>>k;
int unit=sqrt(n);
cnt[0]=1;
for(int i=1;i<=n;i++)
{
cin>>pr[i];
pr[i]^=pr[i-1];
pos[i]=i/unit;
}
for(int i=1;i<=m;i++)
{
int l,r;
cin>>l>>r;
Q[i].l=l;
Q[i].r=r;
Q[i].id=i;
}
sort(Q+1,Q+1+m,cmp);
for(int i=1;i<=m;i++)
{
while(L<Q[i].l)
{
del(L-1);
L++;
}
while(L>Q[i].l)
{
L--;
add(L-1);
}
while(R>Q[i].r)
{
del(R);
R--;
}
while(R<Q[i].r)
{
R++;
add(R);
}
ans[Q[i].id]=Ans;
}
for(int i=1;i<=m;i++) cout<<ans[i]<<endl;
return 0;
}
Copyright © 2019 rocky. All rights reserved. |
---|