#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e6+5;
int pos[maxn],SIZE;
int n,m,k,b[maxn],l,r;
LL tot,cnt[maxn],res,ANS[maxn],ans;
struct Quiry
{
int l,r,id;
}a[maxn];
inline void add(int r1,int r2,int i){a[++tot]=(Quiry){r1,r2,i};}
inline bool cmp(const Quiry&A,const Quiry&B){return pos[A.l]<pos[B.l]||(pos[A.l]==pos[B.l]&&A.r<B.r);}
inline void Del(int x)
{
--cnt[b[x]];
ans-=cnt[b[x]^k];
}
inline void Ins(int x)
{
ans+=cnt[b[x]^k];
++cnt[b[x]];
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;++i)scanf("%d",b+i);
SIZE=floor(sqrt(1.0*n)+0.5);
for(int i=1;i<=n;++i)pos[i]=(i-1)/SIZE+1;
tot=0;
for(int i=1;i<=m;++i)
{
scanf("%d%d",&l,&r);
add(l,r,i);
}
sort(a+1,a+1+tot,cmp);
int L=1,R=0;
ans=0;
cnt[0]=1;
for(int i=1;i<=tot;++i)
{
int l=a[i].l,r=a[i].r;
while(L<l)Del(L),++L;
while(L>l)--L,Ins(L);
while(R<r)++R,Ins(R);
while(R>r)Del(R),--R;
ANS[a[i].id]=ans;
}
for(int i=1;i<=m;++i)printf("%lld\n",ANS[i]);
}
return 0;
}
转载于:https://www.cnblogs.com/songorz/p/9386598.html