思路:由异或的性质可以知道,要想异或后的值最大,那么每一位的异或后尽可能多的是1,所以我们可以提前预处理中l,r区间中第i位有多少个1,如果数量多与不是1的,那么答案这位就是0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int sum[maxn][33];
int a[maxn];
int n,m;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
for(int j=30;j>=0;j--){
if((a[i]>>j)&1)
{
sum[i][j]++;
}
sum[i][j]+=sum[i-1][j];
}
}
cin>>m;
int l,r;
for(int i=1;i<=m;i++){
ll ans=0;
cin>>l>>r;
int len=r-l+1;
for(int j=0;j<=30;j++){
if(len-sum[r][j]+sum[l-1][j]>sum[r][j]-sum[l-1][j]){
ans+=(1LL<<j);
}
}
cout<<ans<<endl;
}
}