Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ull unsigned long long int
- #define ll long long int
- #define LL_MAX 9223372036854775807
- #define pb push_back
- #define pf push_front
- #define mp make_pair
- #define popb pop_back
- #define vl vector<ll>
- #define bs(v, x) binary_search(v.begin(), v.end(), x)
- #define popf pop_front
- #define p() cout << '\n'
- #define p0(x) cout << x << " "
- #define p1(x) cout << x << '\n'
- #define p2(x, y) cout << x << " " << y << '\n'
- #define p3(x, y, z) cout << x << " " << y << " " << z << '\n'
- #define printv(v) \
- for (ll i = 0; i < v.size(); ++i) \
- cout << v[i] << " "; \
- cout << '\n'
- #define pr1(x) cout << fixed << setprecision(15) << x << '\n'
- #define mod 1000000007
- #define mod1 998244353
- #define fio \
- ios_base::sync_with_stdio(false); \
- cin.tie(NULL)
- #define get(n) \
- ll n; \
- cin >> n
- #define getvec(v, n) \
- vector<ll> v(n); \
- for (ll i = 0; i < n; i++) \
- cin >> v[i];
- #define getstr(s) \
- string s; \
- cin >> s
- #define all(x) x.begin(), x.end()
- #define countBits(x) __builtin_popcount(x)
- using namespace std;
- class Node
- {
- public:
- Node *left;
- Node *right;
- int val{0};
- };
- void add(ll x, Node *head)
- {
- head->val = head->val + 1;
- for (ll i = 30; i >= 0; i--)
- {
- ll curr = (1 << i) & x;
- if (curr == 0)
- {
- if (!head->left)
- {
- Node *node = new Node();
- head->left = node;
- }
- head = head->left;
- head->val = head->val + 1;
- }
- else
- {
- if (!head->right)
- {
- Node *node = new Node();
- head->right = node;
- }
- head = head->right;
- head->val = head->val + 1;
- }
- }
- }
- ll query(ll x, Node *head)
- {
- head->val = head->val - 1;
- ll ans = 0;
- for (ll i = 30; i >= 0; i--)
- {
- ll curr = (1ll << i) & x;
- //p2(ans, curr);
- if (curr == 0)
- {
- if (!head->left || (head->left && head->left->val <= 0))
- {
- head = head->right;
- head->val = head->val - 1;
- ans = (ans + (1ll << i));
- }
- else
- {
- head = head->left;
- head->val = head->val - 1;
- }
- }
- else
- {
- if (!head->right || (head->right && head->right->val <= 0))
- {
- head = head->left;
- head->val = head->val - 1;
- ans = (ans + (1ll << i));
- }
- else
- {
- head = head->right;
- head->val = head->val - 1;
- }
- }
- }
- return ans;
- }
- void mainSolve()
- {
- get(n);
- getvec(a, n);
- getvec(b, n);
- Node *head = new Node();
- for (int x : b)
- {
- add(x, head);
- }
- vl ans;
- for (int x : a)
- {
- ll curr = query(x, head);
- ans.pb(curr);
- }
- printv(ans);
- }
- int main()
- {
- fio;
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- //get(t);
- ll t = 1;
- while (t--)
- {
- mainSolve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement