思路
按位贪心即可,维护一个前缀和统计区间内各数中第i位为1的个数。
代码
#include <bits/stdc++.h>
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0)
using namespace std;
const int maxn = 100010;
int a[maxn];
int sum_1[maxn][40];
int main(){
ios;
int n,q,x = 0,l,r;
cin>>n;
for(int i = 1;i <= n;i++){
cin>>a[i];
for(int j = 1;j <= 31;j++){
if((1<<(j-1)) & a[i]){
sum_1[i][j] += (sum_1[i-1][j] + 1);
}else
sum_1[i][j] = sum_1[i-1][j];
}
}
cin>>q;
while(q--){
cin>>l>>r;
x = 0;
int num = r-l+1;
for(int i = 1;i <= 31;i++){
//区间内第i位1的总个数
int tmp = sum_1[r][i] - sum_1[l-1][i];
if(tmp*2 < num) x |= (1<<(i-1));
}
cout<<x<<'\n';
}
return 0;
}