解法和正解一模一样,为什么只有 40 pts?
#include<bits/stdc++.h>
using namespace std;
#define reg register
#define ll long long
#define int long long
extern "C"{
namespace io{
#define IOSIZE 10000000
static char in[IOSIZE],*p=in,*pp=in,out[IOSIZE],*q=out,ch[20],*t=ch;
inline char gc(){return p==pp&&(pp=(p=in)+fread(in,1,IOSIZE,stdin),p==pp)?EOF:*p++;}
inline ll read(){
reg ll x=0;reg char ch,f=0;
while(!isdigit(ch=gc()))f|=ch=='-';
while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=gc();
return f?-x:x;
}
inline void write(ll x){
x||(*q++=48),x<0&&(*q++='-',x=-x);
while(x)*t++=x%10+48,x/=10;
while(t!=ch)*q++=*--t;
*q++='\n';
}
inline void flush(){fwrite(out,1,q-out,stdout);}
}}
#define rd io::read
#define wt io::write
const int N = 100001;
int n, k, q, one[70], zro[70];
long long a[N], m, t;
inline ll solve(ll m) {
reg ll ans = 0, sum = t;
for (reg int i = 52; i >= 0; --i)
if (one[i] >= zro[i]) ans |= 1ll << i, sum -= (one[i] - zro[i]) * (1ll << i);
if (sum > m) return -1;
for (reg int i = 52; i >= 0; --i)
if (one[i] < zro[i] && sum + (zro[i] - one[i]) * (1ll << i) <= m) ans |= 1ll << i, sum += (zro[i] - one[i]) * (1ll << i);
return ans;
}
signed main() {
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
n = rd();
for (reg int i = 1, x; i <= n; ++i) {
x = a[i] = rd(); t += x;
for (reg int i = 0; i <= 52; ++i)
(x & (1ll << i)) ? ++one[i] : ++zro[i];
}
for (reg int q = rd(); q; --q) {
m = rd();
wt(solve(m));
}io :: flush();
return 0;
}