Advertisement
Astral_Rider

Untitled

Jul 30th, 2023
1,153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // # U320678 无聊的分块 I
  5.  
  6. using i64 = long long;
  7.  
  8. // 每个 deque 相当于分块中的一个块
  9.  
  10. const int maxn = 1e5 + 5,
  11.           S = 500, // deque 数量
  12.     sz = 500,      // 每个 deque 的元素数量 (接近 2 * sqrt n, 可能内存关系, 比开 sqrt n ,也就是比 350 快)
  13.     INF = 1e9;
  14.  
  15. int _inside_cnt = 0; // 所有的 deque 的元素计数
  16. deque<int> block[500 + 5];
  17.  
  18. void add(int x)
  19. {
  20.     ++_inside_cnt;
  21.  
  22.     int t = 1;
  23.     int to_push = INF;
  24.  
  25.     while (t < S) // 尝试从第 t 个块开始往后找一个块插入,因为只有 sqrtn 个块,最多找 sqrtn次
  26.     {
  27.         if (!block[t].size())                      // 如果某个块是空的,那么直接在最后插入, O1
  28.             return void(block[t].emplace_back(x)); // 插完就 return
  29.  
  30.         if (block[t].back() >= x || block[t].size() < sz)
  31.         { // 如果某个 deque 的最大值>=x 或这个块没有满,二分地插入,O( log(sqrtn) ) <= sqrtn
  32.             block[t].insert(lower_bound(block[t].begin(), block[t].end(), x), x);
  33.  
  34.             if (block[t].size() > sz)                           // 如果这个 deque 的数量超过了上限,把末尾多的往后面的 deque 移
  35.                 to_push = block[t].back(), block[t].pop_back(); // 这个操作 O1
  36.  
  37.             break;
  38.         }
  39.  
  40.         t++;
  41.     }
  42.  
  43.     t++;
  44.  
  45.     while (t < S && to_push != INF) // 把刚刚多的元素往后移
  46.     {
  47.         block[t].emplace_front(to_push);
  48.  
  49.         if (block[t].size() > sz) // 如果移完以后,接受了元素的 deque 的超过大小,继续循环地往后移
  50.                                   // 由于最多有 sqrtn 个 deque,这个操作总共不超过 sqrtn 次
  51.             to_push = block[t].back(), block[t].pop_back();
  52.         else
  53.             return;
  54.  
  55.         t++;
  56.     }
  57. }
  58. int get(int kth)
  59. {
  60.     if (kth <= 0) // 实际上数据不会出现这个情况
  61.         return block[1].front();
  62.  
  63.     // 已知每个 deque 块长,可以直接求出第 k 个元素在 b 个 deque 的 p 处,即 block[b][p]
  64.     const int upper_b = (_inside_cnt - 1) / sz + 1;
  65.     const int b = (kth - 1) / sz + 1,
  66.               p = (kth - 1) % sz;
  67.  
  68.     return (kth > _inside_cnt) // // 实际上数据不会出现这个情况
  69.                ? block[upper_b].back()
  70.                : block[b][p];
  71. }
  72.  
  73. int main()
  74. {
  75.  
  76.     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  77.  
  78.     i64 last = 0;
  79.  
  80.     int n, q;
  81.     cin >> n >> q;
  82.  
  83.     _inside_cnt = n;
  84.  
  85.     int z = 1, cnt = 0;
  86.     for (int i = 1; i <= n; i++)
  87.     {
  88.         int t;
  89.         cin >> t;
  90.  
  91.         block[z].emplace_back(t);
  92.         cnt++;
  93.  
  94.         if (cnt == sz)
  95.             z++, cnt = 0;
  96.     }
  97.  
  98.     while (q--)
  99.     {
  100.         int op, x;
  101.         cin >> op >> x;
  102.  
  103.         if (op == 1)
  104.             add(x);
  105.         else if (op == 2)
  106.             last ^= get(x);
  107.     }
  108.  
  109.     cout << last << '\n';
  110.  
  111.     // system("Pause");
  112.     return 0;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement