#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
template <typename T>
T gcd(T a, T b) {
  return b == 0 ? a : gcd(b, a % b);
}
template <typename T>
T LCM(T a, T b) {
  return a * (b / gcd(a, b));
}
template <typename T, typename second>
T expo(T b, second e, const T &m) {
  if (e <= 1) return e == 0 ? 1 : b;
  return (e & 1) == 0 ? expo((b * b) % m, e >> 1, m)
                      : (b * expo((b * b) % m, e >> 1, m)) % m;
}
template <typename T, typename second>
T expo(T b, second e) {
  if (e <= 1) return e == 0 ? 1 : b;
  return (e & 1) == 0 ? expo((b * b), e >> 1) : (b * expo((b * b), e >> 1));
}
template <typename T, typename second>
T modinv(T a, second mod) {
  return expo(a, mod - 2, mod);
}
template <class T, class second>
std::ostream &operator<<(std::ostream &os, const std::pair<T, second> &t) {
  os << "(" << t.first << ", " << t.second << ")";
  return os;
}
template <class T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &t) {
  os << "[";
  for (__typeof(t.begin()) it = t.begin(); it != t.end(); it++) {
    if (it != t.begin()) os << ", ";
    os << *it;
  }
  os << "]";
  return os;
}
template <typename T>
void in(T &x) {
  T c = getchar();
  while (((c < 48) || (c > 57)) && (c != '-')) c = getchar();
  bool neg = false;
  if (c == '-') neg = true;
  x = 0;
  for (; c < 48 || c > 57; c = getchar())
    ;
  for (; c > 47 && c < 58; c = getchar()) x = (x * 10) + (c - 48);
  if (neg) x = -x;
}
const int MAXN = 2e5 + 3;
long long b[MAXN], c[MAXN], n, sum_b, sum_c;
long long a[MAXN];
int cnt[32];
bool affirm() {
  for (int i = 1; i <= n; i++) {
    for (int b = 0; b < 32; b++) {
      if ((1ll << b) & a[i]) {
        cnt[b]++;
      }
    }
  }
  long long x, y;
  for (int i = 1; i <= n; i++) {
    x = 0, y = 0;
    for (int b = 0; b < 32; b++) {
      if ((1ll << b) & a[i]) {
        x += (1ll << b) * cnt[b];
        y += (1ll << b) * n;
      } else {
        y += (1ll << b) * cnt[b];
      }
    }
    if (x != b[i] || y != c[i]) return false;
  }
  return true;
}
int main() {
  in(n);
  for (int i = 1; i <= n; i++) in(b[i]), sum_b += b[i];
  for (int i = 1; i <= n; i++) in(c[i]), sum_c += c[i];
  if ((sum_b + sum_c) % (2 * n) != 0) {
    puts("-1");
    return 0;
  }
  long long sum = (sum_b + sum_c) / (2 * n);
  bool ok = true;
  for (int i = 1; i <= n; i++) {
    ok &= (b[i] + c[i] - sum) % n == 0;
  }
  if (ok) {
    for (int i = 1; i <= n; i++) {
      a[i] = (b[i] + c[i] - sum) / n;
    }
    if (affirm()) {
      for (int i = 1; i <= n; i++) {
        printf("%d ", a[i]);
      }
      puts("");
    } else {
      puts("-1");
    }
  } else {
    puts("-1");
  }
  return 0;
}

### Prompt

Your task is to create a CPP solution to 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 long long mod = 1e9 + 7;
template <typename T>
T gcd(T a, T b) {
  return b == 0 ? a : gcd(b, a % b);
}
template <typename T>
T LCM(T a, T b) {
  return a * (b / gcd(a, b));
}
template <typename T, typename second>
T expo(T b, second e, const T &m) {
  if (e <= 1) return e == 0 ? 1 : b;
  return (e & 1) == 0 ? expo((b * b) % m, e >> 1, m)
                      : (b * expo((b * b) % m, e >> 1, m)) % m;
}
template <typename T, typename second>
T expo(T b, second e) {
  if (e <= 1) return e == 0 ? 1 : b;
  return (e & 1) == 0 ? expo((b * b), e >> 1) : (b * expo((b * b), e >> 1));
}
template <typename T, typename second>
T modinv(T a, second mod) {
  return expo(a, mod - 2, mod);
}
template <class T, class second>
std::ostream &operator<<(std::ostream &os, const std::pair<T, second> &t) {
  os << "(" << t.first << ", " << t.second << ")";
  return os;
}
template <class T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &t) {
  os << "[";
  for (__typeof(t.begin()) it = t.begin(); it != t.end(); it++) {
    if (it != t.begin()) os << ", ";
    os << *it;
  }
  os << "]";
  return os;
}
template <typename T>
void in(T &x) {
  T c = getchar();
  while (((c < 48) || (c > 57)) && (c != '-')) c = getchar();
  bool neg = false;
  if (c == '-') neg = true;
  x = 0;
  for (; c < 48 || c > 57; c = getchar())
    ;
  for (; c > 47 && c < 58; c = getchar()) x = (x * 10) + (c - 48);
  if (neg) x = -x;
}
const int MAXN = 2e5 + 3;
long long b[MAXN], c[MAXN], n, sum_b, sum_c;
long long a[MAXN];
int cnt[32];
bool affirm() {
  for (int i = 1; i <= n; i++) {
    for (int b = 0; b < 32; b++) {
      if ((1ll << b) & a[i]) {
        cnt[b]++;
      }
    }
  }
  long long x, y;
  for (int i = 1; i <= n; i++) {
    x = 0, y = 0;
    for (int b = 0; b < 32; b++) {
      if ((1ll << b) & a[i]) {
        x += (1ll << b) * cnt[b];
        y += (1ll << b) * n;
      } else {
        y += (1ll << b) * cnt[b];
      }
    }
    if (x != b[i] || y != c[i]) return false;
  }
  return true;
}
int main() {
  in(n);
  for (int i = 1; i <= n; i++) in(b[i]), sum_b += b[i];
  for (int i = 1; i <= n; i++) in(c[i]), sum_c += c[i];
  if ((sum_b + sum_c) % (2 * n) != 0) {
    puts("-1");
    return 0;
  }
  long long sum = (sum_b + sum_c) / (2 * n);
  bool ok = true;
  for (int i = 1; i <= n; i++) {
    ok &= (b[i] + c[i] - sum) % n == 0;
  }
  if (ok) {
    for (int i = 1; i <= n; i++) {
      a[i] = (b[i] + c[i] - sum) / n;
    }
    if (affirm()) {
      for (int i = 1; i <= n; i++) {
        printf("%d ", a[i]);
      }
      puts("");
    } else {
      puts("-1");
    }
  } else {
    puts("-1");
  }
  return 0;
}

```