#include<bits/stdc++.h> #define MAXN 100005 #define MAXM 16384 #define int long long usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int pos[MAXN],a[MAXN],cnt[MAXN],buc[MAXN],Size; int top,stk[MAXN],sum[MAXN],Ans[MAXN]; structQuery{ int l,r,f,id,ans; }Q[MAXN]; inlinebooloperator < (const Query &a,const Query &b){ return pos[a.l]<pos[b.l]||(pos[a.l]==pos[b.l]&&((pos[a.l]&1)?a.r<b.r:a.r>b.r));//奇偶性排序的压行写法 } int n,m,k; inlinevoidInit(){ cnt[0]=0; for (registerint i=1;i<MAXM;++i){ cnt[i]=cnt[i>>1]+(i&1); if (cnt[i]==k) stk[++top]=i; } if (cnt[0]==k) stk[++top]=0; Size=sqrt(n); for (registerint i=1;i<=n;++i){ pos[i]=(i-1)/Size+1; } } vector<Query> S[MAXN]; inlinevoidAddQuery(int pos,int l,int r,int f,int id){ if (pos!=0&&l<=r) S[pos].push_back(Query{l,r,f,id,0}); } #undef int intmain(){ #define int long long n=read(),m=read(),k=read(); Init(); if (k>14){ for (registerint i=1;i<=m;++i){ puts("0"); } return0; } for (registerint i=1;i<=n;++i){ a[i]=read(); } for (registerint i=1;i<=m;++i){ int l=read(),r=read(); Q[i]=Query{l,r,0,i,0}; } sort(Q+1,Q+1+m); //a[i] xor a[j]==x -> a[j]=a[i] xor x for (registerint i=1;i<=n;++i){ for (registerint j=1;j<=top;++j) buc[a[i]^stk[j]]++; sum[i]=buc[a[i+1]]; } int l=1,r=0; for (registerint i=1;i<=m;++i){ AddQuery(r,l,Q[i].l-1,-1,i); while (l<Q[i].l) Q[i].ans+=sum[l++-1];
AddQuery(r,Q[i].l,l-1,1,i); while (l>Q[i].l) Q[i].ans-=sum[--l-1];
AddQuery(l-1,r+1,Q[i].r,-1,i); while (r<Q[i].r) Q[i].ans+=sum[++r-1]; AddQuery(l-1,Q[i].r+1,r,1,i); while (r>Q[i].r) Q[i].ans-=sum[r---1]; } memset(buc,0,sizeof(buc)); for (registerint i=1;i<=n;++i){ for (registerint j=1;j<=top;++j) buc[a[i]^stk[j]]++; for (registerint p=0;p<S[i].size();++p){ int l=S[i][p].l, r=S[i][p].r, f=S[i][p].f, id=S[i][p].id; for (registerint j=l;j<=r;++j){ int temp=buc[a[j]]; if (k==0&&j<=i) temp--; Q[id].ans+=f*temp; } } } for (registerint i=1;i<=m;++i) Q[i].ans+=Q[i-1].ans,Ans[Q[i].id]=Q[i].ans; for (registerint i=1;i<=m;++i) printf("%lld\n",Ans[i]); }