Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- // # U320678 无聊的分块 I
- using i64 = long long;
- // 每个 deque 相当于分块中的一个块
- const int maxn = 1e5 + 5,
- S = 500, // deque 数量
- sz = 500, // 每个 deque 的元素数量 (接近 2 * sqrt n, 可能内存关系, 比开 sqrt n ,也就是比 350 快)
- INF = 1e9;
- int _inside_cnt = 0; // 所有的 deque 的元素计数
- deque<int> block[500 + 5];
- void add(int x)
- {
- ++_inside_cnt;
- int t = 1;
- int to_push = INF;
- while (t < S) // 尝试从第 t 个块开始往后找一个块插入,因为只有 sqrtn 个块,最多找 sqrtn次
- {
- if (!block[t].size()) // 如果某个块是空的,那么直接在最后插入, O1
- return void(block[t].emplace_back(x)); // 插完就 return
- if (block[t].back() >= x || block[t].size() < sz)
- { // 如果某个 deque 的最大值>=x 或这个块没有满,二分地插入,O( log(sqrtn) ) <= sqrtn
- block[t].insert(lower_bound(block[t].begin(), block[t].end(), x), x);
- if (block[t].size() > sz) // 如果这个 deque 的数量超过了上限,把末尾多的往后面的 deque 移
- to_push = block[t].back(), block[t].pop_back(); // 这个操作 O1
- break;
- }
- t++;
- }
- t++;
- while (t < S && to_push != INF) // 把刚刚多的元素往后移
- {
- block[t].emplace_front(to_push);
- if (block[t].size() > sz) // 如果移完以后,接受了元素的 deque 的超过大小,继续循环地往后移
- // 由于最多有 sqrtn 个 deque,这个操作总共不超过 sqrtn 次
- to_push = block[t].back(), block[t].pop_back();
- else
- return;
- t++;
- }
- }
- int get(int kth)
- {
- if (kth <= 0) // 实际上数据不会出现这个情况
- return block[1].front();
- // 已知每个 deque 块长,可以直接求出第 k 个元素在 b 个 deque 的 p 处,即 block[b][p]
- const int upper_b = (_inside_cnt - 1) / sz + 1;
- const int b = (kth - 1) / sz + 1,
- p = (kth - 1) % sz;
- return (kth > _inside_cnt) // // 实际上数据不会出现这个情况
- ? block[upper_b].back()
- : block[b][p];
- }
- int main()
- {
- ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
- i64 last = 0;
- int n, q;
- cin >> n >> q;
- _inside_cnt = n;
- int z = 1, cnt = 0;
- for (int i = 1; i <= n; i++)
- {
- int t;
- cin >> t;
- block[z].emplace_back(t);
- cnt++;
- if (cnt == sz)
- z++, cnt = 0;
- }
- while (q--)
- {
- int op, x;
- cin >> op >> x;
- if (op == 1)
- add(x);
- else if (op == 2)
- last ^= get(x);
- }
- cout << last << '\n';
- // system("Pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement