Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define fi first
- #define se second
- #define pb push_back
- #define pf push_front
- #define popb pop_back
- #define popf pop_front
- #define ins insert
- #define pq priority_queue
- #define minele min_element
- #define maxele max_element
- #define lb lower_bound //first pos >= val
- #define ub upper_bound // first pos > val
- #define cnt_bit __builtin_popcount
- #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
- //#pragma GCC optimize("Ofast")
- //#pragma GCC target("avx,avx2,fma")
- using namespace std;
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef pair<int, int> pii;
- int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
- int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
- int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
- const ll oo = 1e18;
- const ll maxN = 1e6;
- /* Author : Le Ngoc Bao Anh, 10A5, LQD High School for Gifted Student */
- void maximize(int &a, int b) {
- a = max(a, b);
- }
- void minimize(int &a, int b) {
- a = min(a, b);
- }
- const int N = 1e5 + 10;
- pii q[N];
- int a[N], d[50 * N];
- pll bit[2 * N];
- int child[N * 30][2];
- int g[N * 30][20][2];
- ll tot[N * 60];
- ll getTrie(int pos, int node, int n, int x) {
- if(pos < 0 || n == 0) return 0;
- int p = (x >> pos & 1);
- ll ans = 0;
- if(n < d[child[node][p]]){
- ans = getTrie(pos - 1, child[node][p], min(n, d[child[node][p]]), x);
- } else {
- int b = child[node][p];
- for(int i = pos - 1; i >= 0; i--) {
- int p = (x >> i & 1);
- ans += 1ll * (1 << i) * g[b][i][p ^ 1];
- }
- }
- n -= min(n, d[child[node][p]]);
- ans += getTrie(pos - 1, child[node][p ^ 1], min(n, d[child[node][p ^ 1]]), x);
- ans += (1 << pos) * min(n, d[child[node][p ^ 1]]);
- return ans;
- }
- void solve() {
- int n; cin >> n;
- bool ok = true;
- for(int i = 1; i <= n; i++) {
- cin >> q[i].fi >> q[i].se;
- ok &= (q[i].fi != 2);
- }
- auto sub1 = [&]() -> void {
- int cnt = 0;
- for(int i = 1; i <= n; i++) {
- if(q[i].fi == 0) {
- a[++cnt] = q[i].se;
- }
- if(q[i].fi == 1) {
- for(int j = 1; j <= cnt; j++) {
- if(a[j] == q[i].se) {
- swap(a[j], a[cnt]);
- a[cnt--] = 0;
- break;
- }
- }
- }
- if(q[i].fi == 2) {
- for(int j = 1; j <= cnt; j++) {
- a[j] ^= q[i].se;
- }
- }
- if(q[i].fi == 3) {
- sort(a + 1, a + 1 + cnt);
- ll ans = 0;
- for(int j = 1; j <= q[i].se; j++) ans += a[j];
- cout << ans << '\n';
- }
- }
- };
- // if(n <= 1000) {
- // sub1();
- // return;
- // }
- auto sub2 = [&]() -> void {
- const int B = (1 << 17);
- auto update = [&](int x, int r) -> void {
- for(int i = x; i <= B; i += i & (-i)) {
- if(r) bit[i].fi += x, bit[i].se++;
- else bit[i].fi -= x, bit[i].se--;
- }
- };
- auto get = [&](int x) -> pll {
- pll ans = make_pair(0, 0);
- for(int i = x; i > 0; i -= i & (-i)) {
- ans.fi += bit[i].fi, ans.se += bit[i].se;
- }
- return ans;
- };
- for(int i = 1; i <= n; i++) {
- if(q[i].fi == 0) {
- update(q[i].se, 1);
- d[q[i].se]++;
- }
- if(q[i].fi == 1) {
- if(d[q[i].se]) {
- update(q[i].se, 0);
- d[q[i].se]--;
- }
- }
- if(q[i].fi == 3) {
- int L = 1, R = B;
- ll ans = 0;
- while(L <= R) {
- int mid = (L + R) >> 1;
- pll curr = get(mid);
- if(curr.se >= q[i].se) {
- ans = curr.fi - 1ll * (curr.se - q[i].se) * mid;
- R = mid - 1;
- } else L = mid + 1;
- }
- cout << ans << "\n";
- }
- }
- };
- // if(ok) {
- // sub2();
- // return;
- // }
- const int LOG = 16;
- int cnt = 0;
- auto addTrie = [&](int x) -> void {
- int node = 0;
- for(int i = LOG; i >= 0; i--) {
- int p = (x >> i & 1);
- if(!child[node][p]) {
- child[node][p] = ++cnt;
- node = child[node][p];
- } else node = child[node][p];
- d[node]++;
- for(int j = i; j >= 0; j--) {
- g[node][j][(x >> j & 1)]++;
- }
- }
- };
- auto delTrie = [&](int x) -> void {
- int node = 0;
- for(int i = LOG; i >= 0; i--) {
- int p = (x >> i & 1);
- if(!child[node][p]) return;
- node = child[node][p];
- if(!d[node]) return;
- }
- node = 0;
- for(int i = LOG; i >= 0; i--) {
- int p = (x >> i & 1);
- node = child[node][p];
- d[node]--;
- for(int j = i; j >= 0; j--) {
- g[node][j][(x >> j & 1)]--;
- }
- }
- };
- auto sub3 = [&]() -> void {
- int x = 0;
- for(int i = 1; i <= n; i++) {
- if(q[i].fi == 0) {
- addTrie(q[i].se ^ x);
- }
- if(q[i].fi == 1) {
- delTrie(q[i].se ^ x);
- }
- if(q[i].fi == 2) {
- x ^= q[i].se;
- }
- if(q[i].fi == 3) {
- cout << getTrie(LOG, 0, q[i].se, x) << '\n';
- }
- }
- };
- sub3();
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #else
- //online
- #endif
- int tc = 1, ddd = 0;
- // cin >> tc;
- while(tc--) {
- //ddd++;
- //cout << "Case #" << ddd << ": ";
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement