func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   const int MAXN = 200010;   int B[MAXN], C[MAXN], a[MAXN];   long long b[MAXN], c[MAXN];   struct Node {     int b, c, id;     bool operator<(const Node ano) const { return b + c < ano.b + ano.c; }   } opt[MAXN];   int cnt[MAXN];   bool check(int x) {     int now = x;     for (int i = 1; i <= n; i++) {       a[opt[i].id] = now;       now += ((opt[i + 1].b + opt[i + 1].c - opt[i].b - opt[i].c) / n);     }     memset(cnt, 0, sizeof cnt);     memset(b, 0, sizeof b);     memset(c, 0, sizeof c);     for (int i = 1; i <= n; i++) {       for (int j = 0; j < 30; j++) {         if ((a[i] >> j) & 1) cnt[j]++;       }     }     for (int i = 1; i <= n; i++) {       for (int j = 0; j < 30; j++) {         if ((a[i] >> j) & 1) {           b[i] += 1LL * cnt[j] * (1 << j);           c[i] += 1LL * n * (1 << j);         } else {           c[i] += 1LL * cnt[j] * (1 << j);         }       }     }     return b[1] + c[1] >= B[1] + C[1];   }   bool check2(int x) {     int now = x;     for (int i = 1; i <= n; i++) {       a[opt[i].id] = now;       now += ((opt[i + 1].b + opt[i + 1].c - opt[i].b - opt[i].c) / n);     }     memset(cnt, 0, sizeof cnt);     memset(b, 0, sizeof b);     memset(c, 0, sizeof c);     for (int i = 1; i <= n; i++) {       for (int j = 0; j < 30; j++) {         if ((a[i] >> j) & 1) cnt[j]++;       }     }     for (int i = 1; i <= n; i++) {       for (int j = 0; j < 30; j++) {         if ((a[i] >> j) & 1) {           b[i] += 1LL * cnt[j] * (1 << j);           c[i] += 1LL * n * (1 << j);         } else {           c[i] += 1LL * cnt[j] * (1 << j);         }       }     }     for (int i = 1; i <= n; i++) {       if ((b[i] != B[i]) || (c[i] != C[i])) return 0;     }     return 1;   }   int main() {     scanf( %d , &n);     for (int i = 1; i <= n; i++)       scanf( %d , &opt[i].b), B[i] = opt[i].b, opt[i].id = i;     for (int i = 1; i <= n; i++) scanf( %d , &opt[i].c), C[i] = opt[i].c;     sort(opt + 1, opt + n + 1);     for (int i = 2; i <= n; i++) {       if ((opt[i].b + opt[i].c - opt[i - 1].b - opt[i - 1].c) % n != 0) {         puts( -1 );         return 0;       }     }     int l = 0, r = 1000000000;     while (l < r) {       int mid = (l + r) >> 1;       if (check(mid))         r = mid;       else         l = mid + 1;     }     if (check2(l)) {       for (int i = 1; i <= n; i++) printf( %d%c , a[i], (i == n ? 10 :    ));     } else       puts( -1 );   }   