RT,我调试的时候把值域开成了 24 交上去 WA 了,改回 214 就过了。但我第一次交的时候显示 read -,可是 V 变小顶多会少统计一些合法对啊,为什么会出现负数?求大佬帮忙康康QAQ
//author:望远星
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sml(x,y) (x=min(x,y))
#define big(x,y) (x=max(x,y))
#define ll long long
#define ull unsigned long long
#define db double
#define fo(i,x,y) for(int i=x;i<=y;++i)
#define go(i,x,y) for(int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,fh=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')fh=-1;ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*fh;}
inline void out(auto *a,int l,int r){fo(i,l,r) cout<<*(a+i)<<' ';puts("");}
const int N=1e5+5,V=1<<14|1;
int a[N],n,m,bel[N],k,l=1,r,b[N],B;
ll delta[N],suml[N],sumr[N],ans[N];
struct Ask{
int l,r,num;
bool operator<(const Ask &x)const{
if(bel[l]!=bel[x.l]) return bel[l]<bel[x.l];
return r<x.r;
}
}A[N];
struct ChangE{
int l,r,o,num;
ChangE(){l=r=o=num=0;}
ChangE(int x,int y,int z,int zz){l=x,r=y,o=z,num=zz;}
};
vector<ChangE> g[N];
vector<int> qaq;
void dealR(int R,int id){//r->R
if(R>r){
delta[id]+=sumr[R]-sumr[r];
g[l-1].pb(ChangE(r+1,R,-1,id));
}else{
delta[id]-=sumr[r]-sumr[R];
g[l-1].pb(ChangE(R+1,r,1,id));
}
r=R;
}
signed main(){
cin>>n>>m>>k;B=n/sqrt(m);
fo(i,1,n) a[i]=read(),bel[i]=bel[i-1]+(i%B==1);
fo(i,0,V) if(__builtin_popcount(i)==k) qaq.pb(i);
//sumr:i到[1,i-1],用于处理挪动右端点的贡献 suml:i到[1,i],用于处理挪动左端点的贡献
//for(int i:qaq) cout<<i<<' ';putchar('\n');
fo(i,1,n){
sumr[i]=sumr[i-1]+b[a[i]];
for(int j:qaq) b[j^a[i]]++;
suml[i]=suml[i-1]+b[a[i]];
}
fo(i,1,m){
A[i].l=read();
A[i].r=read();
A[i].num=i;
}
sort(A+1,A+1+m);
fo(i,1,m){
//printf("[%d,%d] %d\n",A[i].l,A[i].r,A[i].num);
if(A[i].l<l){//l->A[i].l(扩展)
delta[i]-=suml[l-1]-suml[A[i].l-1];
g[r].pb(ChangE(A[i].l,l-1,1,i));
l=A[i].l;
dealR(A[i].r,i);
}else{//蜷缩
dealR(A[i].r,i);
delta[i]+=suml[A[i].l-1]-suml[l-1];
g[r].pb(ChangE(l,A[i].l-1,-1,i));
l=A[i].l;
}
//l=A[i].l,r=A[i].r;
}
fo(i,0,V) b[i]=0;
fo(i,1,n){
for(int j:qaq) b[j^a[i]]++;
for(auto j:g[i])
fo(w,j.l,j.r) delta[j.num]+=j.o*b[a[w]];
}
//out(delta,1,m);
fo(i,1,m){
delta[i]+=delta[i-1];
ans[A[i].num]=delta[i];
}
fo(i,1,m) cout<<ans[i]<<'\n';
return 0;
}
/*
-------------------------------------------------
*/