倍增求掉
查看原帖
倍增求掉
547238
篮网总冠军楼主2025/6/29 16:56
#include <bits/stdc++.h>
using namespace std;

int a[200005];
int bz[200005][25];
int sum[200005],s[200005];
int pow(int x,int y){
	int ans=1;
	while(y--) ans=ans*x;
	return ans;
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) s[a[i]]++;
	for(int i=1;i<=m;i++) sum[i]=sum[i-1]+s[i];
	for(int i=1;(1<<i)<=m;i++){
		for(int j=1;j+(1<<i)-1<=m;j++){
			bz[j][i]=(bz[j][i-1]^bz[j+(1<<(i-1))][i-1])^((sum[i+(1<<j)-1]-sum[i+(1<<(j-1))-1])*pow(2,j-1));
		}
	}
	int q;
	cin>>q;
	while(q--){
		int l,r;
		cin>>l>>r;
		int ans=0;
		while(l<=r){
			int k=log2(r-l+1);
			int v=sum[r]-sum[l+pow(2,k)-1];
			int p=bz[l][k];
			ans=ans^p^(pow(2,k)*(v%2));
			l=l+pow(2,k);
		}
		if (ans==0) cout<<"B";
		else cout<<"A";
	}
	return 0;
}

2025/6/29 16:56
加载中...