CF1511G Chips on a Board
逐位思考的好题目。
#include<cstdio>
const int H=10000010;
char G[H],*_=G;
int read(){
int x=0;
while(*_<'0'||'9'<*_)_++;
while('0'<=*_&&*_<='9')x=x*10+(*_++^'0');
return x;
}
const int N=200020,M=20;
int sum[N],lg[N],st[M][N];
char A[N],*O=A;
int main(){
fread(G,1,H,stdin);
int n=read(),m=read(),i,j,q,l,r,ans;
for(i=1;i<=n;i++)sum[read()]++;
for(i=1;i<=m;i++)sum[i]+=sum[i-1];
for(i=2;i<=m;i++)lg[i]=lg[i>>1]+1;
for(j=1;j<=lg[m];j++)
for(i=1;i+(1<<j)-1<=m;i++)
st[j][i]=st[j-1][i]^st[j-1][i+(1<<j-1)]^((1<<j-1)*((sum[i+(1<<j)-1]-sum[i+(1<<j-1)-1])&1));
q=read();
while(q--){
l=read(),r=read(),ans=0;
for(i=lg[m];~i;i--)if(l+(1<<i)<=r){
ans^=st[i][l],l+=(1<<i);
if((sum[r]-sum[l-1])&1)ans^=(1<<i);
}
ans?*O++='A':*O++='B';
}
fwrite(A,1,O-A,stdout);
return 0;
}