Advertisement
BaoJIaoPisu

Untitled

Sep 27th, 2021
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.97 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pb push_back
  5. #define pf push_front
  6. #define popb pop_back
  7. #define popf pop_front
  8. #define ins insert
  9. #define pq priority_queue
  10. #define minele min_element
  11. #define maxele max_element
  12. #define lb lower_bound //first pos >= val
  13. #define ub upper_bound // first pos > val
  14. #define cnt_bit __builtin_popcount
  15. #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  16. //#pragma GCC optimize("Ofast")
  17. //#pragma GCC target("avx,avx2,fma")
  18. using namespace std;
  19.  
  20. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  21.  
  22. typedef long long ll;
  23. typedef pair<ll, ll> pll;
  24. typedef pair<int, int> pii;
  25.  
  26.  
  27. int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
  28. int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
  29. int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
  30.  
  31. const ll oo = 1e18;
  32. const ll maxN = 1e6;
  33.  
  34. /* Author : Le Ngoc Bao Anh, 10A5, LQD High School for Gifted Student */
  35.  
  36. void maximize(int &a, int b) {
  37.     a = max(a, b);
  38. }
  39.  
  40. void minimize(int &a, int b) {
  41.     a = min(a, b);
  42. }
  43.  
  44. const int N = 1e5 + 10;
  45. pii q[N];
  46. int a[N], d[50 * N];
  47. pll bit[2 * N];
  48. int child[N * 30][2];
  49. int g[N * 30][20][2];
  50. ll tot[N * 60];
  51.  
  52. ll getTrie(int pos, int node, int n, int x) {
  53.     if(pos < 0 || n == 0) return 0;
  54.     int p = (x >> pos & 1);
  55.     ll ans = 0;
  56.     if(n < d[child[node][p]]){
  57.         ans = getTrie(pos - 1, child[node][p], min(n, d[child[node][p]]), x);
  58.     } else {
  59.         int b = child[node][p];
  60.         for(int i = pos - 1; i >= 0; i--) {
  61.             int p = (x >> i & 1);
  62.             ans += 1ll * (1 << i) * g[b][i][p ^ 1];
  63.         }
  64.     }
  65.     n -= min(n, d[child[node][p]]);
  66.     ans += getTrie(pos - 1, child[node][p ^ 1], min(n, d[child[node][p ^ 1]]), x);
  67.     ans += (1 << pos) * min(n, d[child[node][p ^ 1]]);
  68.     return ans;
  69. }
  70.  
  71. void solve() {
  72.     int n; cin >> n;
  73.  
  74.     bool ok = true;
  75.     for(int i = 1; i <= n; i++)  {
  76.         cin >> q[i].fi >> q[i].se;
  77.         ok &= (q[i].fi != 2);
  78.     }
  79.  
  80.     auto sub1 = [&]() -> void {
  81.         int cnt = 0;
  82.         for(int i = 1; i <= n; i++) {
  83.             if(q[i].fi == 0) {
  84.                 a[++cnt] = q[i].se;
  85.             }
  86.  
  87.             if(q[i].fi == 1) {
  88.                 for(int j = 1; j <= cnt; j++) {
  89.                     if(a[j] == q[i].se) {
  90.                         swap(a[j], a[cnt]);
  91.                         a[cnt--] = 0;
  92.                         break;
  93.                     }
  94.                 }
  95.             }
  96.  
  97.             if(q[i].fi == 2) {
  98.                 for(int j = 1; j <= cnt; j++) {
  99.                     a[j] ^= q[i].se;
  100.                 }
  101.             }
  102.  
  103.             if(q[i].fi == 3) {
  104.                 sort(a + 1, a + 1 + cnt);
  105.                 ll ans = 0;
  106.                 for(int j = 1; j <= q[i].se; j++) ans += a[j];
  107.                 cout << ans << '\n';
  108.             }
  109.         }
  110.     };
  111.  
  112.     // if(n <= 1000) {
  113.     //  sub1();
  114.     //  return;
  115.     // }
  116.  
  117.     auto sub2 = [&]() -> void {
  118.         const int B = (1 << 17);
  119.         auto update = [&](int x, int r) -> void {
  120.             for(int i = x; i <= B; i += i & (-i)) {
  121.                 if(r) bit[i].fi += x, bit[i].se++;
  122.                 else bit[i].fi -= x, bit[i].se--;
  123.             }
  124.         };
  125.  
  126.         auto get = [&](int x) -> pll {
  127.             pll ans = make_pair(0, 0);
  128.             for(int i = x; i > 0; i -= i & (-i)) {
  129.                 ans.fi += bit[i].fi, ans.se += bit[i].se;
  130.             }
  131.  
  132.             return ans;
  133.         };
  134.  
  135.         for(int i = 1; i <= n; i++) {
  136.             if(q[i].fi == 0) {
  137.                 update(q[i].se, 1);
  138.                 d[q[i].se]++;
  139.             }
  140.  
  141.             if(q[i].fi == 1) {
  142.                 if(d[q[i].se]) {
  143.                     update(q[i].se, 0);
  144.                     d[q[i].se]--;
  145.                 }
  146.             }
  147.  
  148.             if(q[i].fi == 3) {
  149.                 int L = 1, R = B;
  150.                 ll ans = 0;
  151.                 while(L <= R) {
  152.                     int mid = (L + R) >> 1;
  153.                     pll curr = get(mid);
  154.                     if(curr.se >= q[i].se) {
  155.                         ans = curr.fi - 1ll * (curr.se - q[i].se) * mid;
  156.                         R = mid - 1;
  157.                     } else L = mid + 1;
  158.                 }
  159.  
  160.                 cout << ans << "\n";
  161.             }
  162.         }
  163.     };
  164.  
  165.     // if(ok) {
  166.     //  sub2();
  167.     //  return;
  168.     // }
  169.  
  170.     const int LOG = 16;
  171.     int cnt = 0;
  172.     auto addTrie = [&](int x) -> void {
  173.         int node = 0;
  174.         for(int i = LOG; i >= 0; i--) {
  175.             int p = (x >> i & 1);
  176.             if(!child[node][p]) {
  177.                 child[node][p] = ++cnt;
  178.                 node = child[node][p];
  179.             } else node = child[node][p];
  180.             d[node]++;
  181.             for(int j = i; j >= 0; j--) {
  182.                 g[node][j][(x >> j & 1)]++;
  183.             }
  184.         }
  185.     };
  186.  
  187.     auto delTrie = [&](int x) -> void {
  188.         int node = 0;
  189.         for(int i = LOG; i >= 0; i--) {
  190.             int p = (x >> i & 1);
  191.             if(!child[node][p]) return;
  192.             node = child[node][p];
  193.             if(!d[node]) return;
  194.         }
  195.  
  196.         node = 0;
  197.         for(int i = LOG; i >= 0; i--) {
  198.             int p = (x >> i & 1);
  199.             node = child[node][p];
  200.             d[node]--;
  201.             for(int j = i; j >= 0; j--) {
  202.                 g[node][j][(x >> j & 1)]--;
  203.             }
  204.         }
  205.     };
  206.  
  207.     auto sub3 = [&]() -> void {
  208.         int x = 0;
  209.         for(int i = 1; i <= n; i++) {
  210.             if(q[i].fi == 0) {
  211.                 addTrie(q[i].se ^ x);
  212.             }
  213.  
  214.             if(q[i].fi == 1) {
  215.                 delTrie(q[i].se ^ x);
  216.             }
  217.  
  218.             if(q[i].fi == 2) {
  219.                 x ^= q[i].se;
  220.             }
  221.  
  222.             if(q[i].fi == 3) {
  223.                 cout << getTrie(LOG, 0, q[i].se, x) << '\n';
  224.             }
  225.         }
  226.     };
  227.  
  228.     sub3();
  229. }
  230.  
  231. int main()
  232. {
  233.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  234.     #ifndef ONLINE_JUDGE
  235.     freopen("input.txt", "r", stdin);
  236.     freopen("output.txt", "w", stdout);
  237.     #else
  238.     //online
  239.     #endif
  240.  
  241.     int tc = 1, ddd = 0;
  242.     // cin >> tc;
  243.     while(tc--) {
  244.         //ddd++;
  245.         //cout << "Case #" << ddd << ": ";
  246.         solve();
  247.     }
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement