Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define NguyenDangQuan the_author
- #define my_heart love_you_to_the_moon_and_back
- #include <bits/stdc++.h>
- #define pb push_back
- #define ld long double
- #define ll long long
- #define ull unsigned long long
- #define float double
- using namespace std;
- int typetest;
- inline void fastIOfileinput(){
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- typetest = 0;
- }
- struct trie{
- trie *child[2];
- int v;
- void upd(int id, int lim, int u, int x, int val){
- //cerr << lim << " ";
- if(id == lim){
- v += val;
- return;
- }
- if(child[(x >> id) & 1] == nullptr)
- child[(x >> id) & 1] = new trie,
- child[(x >> id) & 1] -> v = 0;
- child[(x >> id) & 1] -> upd(id + u, lim, u, x, val);
- if(child[(x >> id) & 1] -> v == 0){
- delete child[(x >> id) & 1];
- child[(x >> id) & 1] = nullptr;
- }
- v += val;
- }
- };
- const int N = 5e4 + 3;
- int n, m;
- vector<int> adj[N];
- int par[N];
- char t;
- int x, ans;
- trie began;
- void Enter(){
- cin >> m;
- began.child[1] = began.child[0] = nullptr;
- began.upd(30, -1, -1, 0, 1);
- }
- void check(trie &a, int id, int lim, int upd, int x){
- if(id == lim)
- return;
- if(a.child[!((x >> id) & 1)] != nullptr){
- ans |= 1 << id;
- check(*a.child[!((x >> id) & 1)], id + upd, lim, upd, x);
- }
- else
- check(*a.child[(x >> id) & 1], id + upd, lim, upd, x);
- }
- void solve(){
- while(m--){
- cin >> t >> x;
- if(t == '+')
- began.upd(30, -1, -1, x, 1);
- else if(t == '-')
- began.upd(30, -1, -1, x, -1);
- else{
- ans = 0;
- check(began, 30, -1, -1, x);
- cout << ans << "\n";
- }
- }
- }
- main(){
- fastIOfileinput();
- if(typetest){
- int t;
- cin >> t;
- while(t--){
- Enter();
- solve();
- }
- }
- else{
- Enter();
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment