RT,样例是可以通过的,但是实际测试就……
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
inline ull read(){
char ch=getchar();
ull x=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
return x;
}
int bits[32],kb[32],kb2[32],n,q,tmp2;
ull pow2[32],tmp,sum,sum2;
inline void calc() {
sum=0;
for(int i=31;i>=0;i--) {
if(kb2[i]) sum+=(n-bits[i])*pow2[i];
else sum+=bits[i]*pow2[i];
}
}
int main(void) {
n=read();
for(int i=0,j=0;i<n;i++) {
tmp=read();
while(tmp) bits[j]+=(tmp&1), j++, tmp>>=1;
j=0;
}
for(int i=0;i<32;i++) {
tmp2=bits[i];
kb[i]=(tmp2>=(n-tmp2))?1:0;
}
memcpy(kb2,kb,sizeof(kb));
q=read();
pow2[0]=1;
for(int i=1;i<32;i++) pow2[i]=pow2[i-1]*2;
for(int i=0;i<q;i++) {
tmp=read();
calc();
if(sum>tmp) {
printf("-1\n");
continue;
}
for(int j=31;j>=0;j--) {
if(!kb2[j]) {
sum2=sum;
sum+=(n-2*bits[j])*pow2[j];
if(sum>tmp) {
printf("%llu\n",sum2);
break;
}
}
}
printf("%llu\n",tmp);
memcpy(kb2,kb,sizeof(kb));
}
return 0;
}