#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3F3F3F3F;
const int NEGINF = 0xC0C0C0C0;
const int NULO = -1;
const double EPS = 1e-8;
int cmp(double x, double y = 0, double tol = EPS) {
  return (x <= y + tol) ? (x + tol < y) ? -1 : 0 : 1;
}
vector<long long> computeOr(const vector<long long>& a) {
  array<int, 63> qtd;
  for (__decltype(63) i = (0); i < (63); ++i) qtd[i] = 0;
  for (long long x : a)
    for (__decltype(63ll) i = (0); i < (63ll); ++i)
      if ((x >> i) & 1) qtd[i]++;
  vector<long long> ans;
  ans.reserve(a.size());
  for (long long x : a) {
    long long val = 0;
    for (__decltype(63ll) i = (0); i < (63ll); ++i) {
      if ((x >> i) & 1)
        val += a.size() << i;
      else
        val += qtd[i] << i;
    }
    ans.push_back(val);
  }
  return ans;
}
vector<long long> computeAnd(const vector<long long>& a) {
  array<int, 63> qtd;
  for (__decltype(63) i = (0); i < (63); ++i) qtd[i] = 0;
  for (long long x : a)
    for (__decltype(63ll) i = (0); i < (63ll); ++i)
      if ((x >> i) & 1) qtd[i]++;
  vector<long long> ans;
  ans.reserve(a.size());
  for (long long x : a) {
    long long val = 0;
    for (__decltype(63ll) i = (0); i < (63ll); ++i)
      if ((x >> i) & 1) val += qtd[i] << i;
    ans.push_back(val);
  }
  return ans;
}
int main() {
  int N;
  scanf("%d", &N);
  vector<long long> b(N), c(N);
  for (long long& x : b) scanf("%lld", &x);
  for (long long& x : c) scanf("%lld", &x);
  long long s = 0;
  for (__decltype(N) i = (0); i < (N); ++i) s += c[i] + b[i];
  if (s % (2 * N) != 0) {
    printf("-1\n");
    return 0;
  }
  s /= 2 * N;
  vector<long long> a(N);
  for (__decltype(N) i = (0); i < (N); ++i) {
    a[i] = b[i] + c[i] - s;
    if (a[i] < 0 || a[i] % N != 0) {
      printf("-1\n");
      return 0;
    }
    a[i] /= N;
  }
  if (b != computeAnd(a) || c != computeOr(a)) {
    printf("-1\n");
  } else {
    for (__decltype(N) i = (0); i < (N); ++i) printf("%lld ", a[i]);
    printf("\n");
  }
  return 0;
}

### Prompt

Create a solution in CPP for the following problem:

Anton goes to school, his favorite lessons are arraystudying. He usually solves all the tasks pretty fast, but this time the teacher gave him a complicated one: given two arrays b and c of length n, find array a, such that:

<image>

where a and b means bitwise AND, while a or b means bitwise OR.

Usually Anton is good in arraystudying, but this problem is too hard, so Anton asks you to help.

Input

The first line of the input contains a single integers n (1 ≤ n ≤ 200 000) — the size of arrays b and c.

The second line contains n integers bi (0 ≤ bi ≤ 109) — elements of the array b.

Third line contains n integers ci (0 ≤ ci ≤ 109) — elements of the array c.

Output

If there is no solution, print  - 1.

Otherwise, the only line of the output should contain n non-negative integers ai — elements of the array a. If there are multiple possible solutions, you may print any of them.

Examples

Input

4
6 8 4 4
16 22 10 10


Output

3 5 1 1 


Input

5
8 25 14 7 16
19 6 9 4 25


Output

-1

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3F3F3F3F;
const int NEGINF = 0xC0C0C0C0;
const int NULO = -1;
const double EPS = 1e-8;
int cmp(double x, double y = 0, double tol = EPS) {
  return (x <= y + tol) ? (x + tol < y) ? -1 : 0 : 1;
}
vector<long long> computeOr(const vector<long long>& a) {
  array<int, 63> qtd;
  for (__decltype(63) i = (0); i < (63); ++i) qtd[i] = 0;
  for (long long x : a)
    for (__decltype(63ll) i = (0); i < (63ll); ++i)
      if ((x >> i) & 1) qtd[i]++;
  vector<long long> ans;
  ans.reserve(a.size());
  for (long long x : a) {
    long long val = 0;
    for (__decltype(63ll) i = (0); i < (63ll); ++i) {
      if ((x >> i) & 1)
        val += a.size() << i;
      else
        val += qtd[i] << i;
    }
    ans.push_back(val);
  }
  return ans;
}
vector<long long> computeAnd(const vector<long long>& a) {
  array<int, 63> qtd;
  for (__decltype(63) i = (0); i < (63); ++i) qtd[i] = 0;
  for (long long x : a)
    for (__decltype(63ll) i = (0); i < (63ll); ++i)
      if ((x >> i) & 1) qtd[i]++;
  vector<long long> ans;
  ans.reserve(a.size());
  for (long long x : a) {
    long long val = 0;
    for (__decltype(63ll) i = (0); i < (63ll); ++i)
      if ((x >> i) & 1) val += qtd[i] << i;
    ans.push_back(val);
  }
  return ans;
}
int main() {
  int N;
  scanf("%d", &N);
  vector<long long> b(N), c(N);
  for (long long& x : b) scanf("%lld", &x);
  for (long long& x : c) scanf("%lld", &x);
  long long s = 0;
  for (__decltype(N) i = (0); i < (N); ++i) s += c[i] + b[i];
  if (s % (2 * N) != 0) {
    printf("-1\n");
    return 0;
  }
  s /= 2 * N;
  vector<long long> a(N);
  for (__decltype(N) i = (0); i < (N); ++i) {
    a[i] = b[i] + c[i] - s;
    if (a[i] < 0 || a[i] % N != 0) {
      printf("-1\n");
      return 0;
    }
    a[i] /= N;
  }
  if (b != computeAnd(a) || c != computeOr(a)) {
    printf("-1\n");
  } else {
    for (__decltype(N) i = (0); i < (N); ++i) printf("%lld ", a[i]);
    printf("\n");
  }
  return 0;
}

```