//笱蒻一枚,有问题请指正
/题目核心是考虑到位运算,每个数据都是int型,那么每个数字都可以看作32位的二进制串;
题目要求出异或最优解,
什么是异或?
例如:
1011101
0100111
异或结果为:111010;
所以这道题我们把32位二进制前31位,每一位的1的个数统计出来,如果个数大于0的个数那么这一位就保留为0否则保留1;
又因为区间查找,这时我们就要想到对前缀和的利用,用两个端点的计算得出这个区间的结果;
开一个二位数组来将一个数竖着储存
/
#include<iostream>
using namespace std;
const int N=100000;
int pp[N],a[35][N],n;</iostream>

int main(){
long long int cnt;//cnt 有点大,其实int就够了都是防止万一爆空间还是用的long long;
int m;
cin>>n;
for(int i=1;i<=n;i++){
cin>>pp[i];
for(int j=0;j<=30;j++){
a[j][i]=a[j][i-1]+((pp[i]>>j)&1);//pp[i]右移j位后与1做按位且运算,既pp[i]的二进制串最后一位是1结果为1否则为0;

    }
}
cin>>m;
for(int i=1,x,y;i<=m;i++){

    cin>>x>>y;cnt=0;
    for(int j=0;j<31;j++){
        int d=a[j][y]-a[j][x-1];//因为边界是要算进去的所以y--x之间为y-(x-1); 
    int    len=y-x+1;
        if(d<len-d){//判断0.1个数 
            cnt+=1<<j;//1<<j相当于pow(2,j)即将二进制转换为十进制; 
        }
    }
    cout<<cnt<<endl;
}
return 0;

}