Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.37 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iomanip>
  3. #include <iostream>
  4. #include <map>
  5. #include <queue>
  6. #include <set>
  7. #include <stack>
  8. #include <string>
  9. #include <vector>
  10. #include <cmath>
  11. #include <numeric>
  12. #include <unordered_map>
  13. #include <random>
  14.  
  15. //#pragma GCC optimize("Ofast,no-stack-protector")
  16. //#pragma target("sse, sse2, sse3, ssse3, sse4, popcnt, abm, mmx, avx, avx2, tune=native")
  17. //#pragma GCC optimize ("unroll-loops")
  18. //#pragma GCC optimize ("fast-math")
  19. //#pragma GCC optimize ("section-anchors")
  20. //#pragma GCC optimize ("profile-values, profile-reorder-functions, tracer")
  21. //#pragma GCC optimize ("vpt")
  22. //#pragma GCC optimize ("rename-registers")
  23. //#pragma GCC optimize ("move-loop-invariants")
  24. //#pragma GCC optimize ("unswitch-loops")
  25. //#pragma GCC optimize ("functions-sections")
  26. //#pragma GCC optimize ("data-sections")
  27. //#pragma GCC optimize ("branch-target-load-optimize")
  28. //#pragma GCC optimize ("branch-target-load-optimize2")
  29. //#pragma GCC optimize ("btr-bb-exclusive")
  30. //#pragma GCC optimize ("O3")
  31.  
  32. using namespace std;
  33. typedef long long ll;
  34. typedef unsigned long long ull;
  35. typedef vector<int> vi;
  36. typedef vector<ll> vll;
  37. typedef vector<bool> vb;
  38. typedef unsigned int uint;
  39. typedef vector<uint> vuint;
  40. #define all(c) c.begin(), c.end()
  41. #define rall(c) c.rbegin(), c.rend()
  42. #define INF 2*0x3f3f3f3f
  43. #define INFLL (ll)(1e18)
  44. #define EPS 1e-9
  45. #define MOD 1000000007
  46.  
  47. template<class T>
  48. istream &operator>>(istream &is, vector<T> &a) {
  49.     for (int i = 0; i < a.size(); ++i)
  50.         is >> a[i];
  51.     return is;
  52. }
  53.  
  54. mt19937 rand_engine;
  55.  
  56. struct item {
  57.     int key, l, r, cnt;
  58.     ll prior;
  59.  
  60.     item() {};
  61.  
  62.     item(int key) : key(key), prior((ll) rand_engine() % MOD), l(0), r(0), cnt(1) {};
  63. };
  64.  
  65. vector<item> tree;
  66.  
  67. int size(int root) {
  68.     if (root == 0)
  69.         return 0;
  70.     return tree[root].cnt;
  71. }
  72.  
  73. void update(int root) {
  74.     if (root)
  75.         tree[root].cnt = size(tree[root].l) + size(tree[root].r) + 1;
  76. }
  77.  
  78. void split(int root, int key, int &l, int &r) {
  79.     if (root == 0)
  80.         l = r = 0;
  81.     else if (tree[root].key > key)
  82.         split(tree[root].l, key, l, tree[root].l), r = root;
  83.     else
  84.         split(tree[root].r, key, tree[root].r, r), l = root;
  85.     update(root);
  86. }
  87.  
  88. int merge(int l, int r) {
  89.     if (!l || !r)
  90.         return max(l, r);
  91.     if (tree[l].prior > tree[r].prior) {
  92.         tree[l].r = merge(tree[l].r, r);
  93.         update(l);
  94.         return l;
  95.     }
  96.     tree[r].l = merge(l, tree[r].l);
  97.     update(r);
  98.     return r;
  99. }
  100.  
  101. bool find(int root, int x) {
  102.     if (root) {
  103.         if (tree[root].key == x)
  104.             return true;
  105.         if (tree[root].key > x)
  106.             return find(tree[root].l, x);
  107.         else
  108.             return find(tree[root].r, x);
  109.     }
  110.     return false;
  111. }
  112.  
  113. void insert(int &root, int x) {
  114.     tree.push_back(item(x));
  115.     int l, r;
  116.     split(root, x, l, r);
  117.     root = merge(merge(l, tree.size() - 1), r);
  118. }
  119.  
  120. int order_of_key(int root, int x) {
  121.     int l, r;
  122.     split(root, x, l, r);
  123.     int a = size(l);
  124.     root = merge(l, r);
  125.     return a;
  126. }
  127.  
  128. int main() {
  129.     ios_base::sync_with_stdio(false);
  130.     cin.tie(nullptr);
  131.     cout.tie(nullptr);
  132.     int n, m;
  133.     cin >> n >> m;
  134.     map<int, int> del;
  135.     int root = 0;
  136.     for (int i = 0; i < m; ++i) {
  137.         char c;
  138.         cin >> c;
  139.         int x;
  140.         cin >> x;
  141.         --x;
  142.         if (c == 'D') {
  143.             int left = 0, right = n;
  144.             while (left + 1 < right) {
  145.                 int mid = (left + right) / 2;
  146.                 int k = order_of_key(root, mid);
  147.                 if (mid - k == x) {
  148.                     insert(root, mid);
  149.                     ++del[mid];
  150.                     // cout << mid << "\n";
  151.                     break;
  152.                 }
  153.                 if (mid - k < x)
  154.                     left = mid;
  155.                 else
  156.                     right = mid;
  157.             }
  158.         } else {
  159.             int left = 0, right = n;
  160.             while (left + 1 < right) {
  161.                 int mid = (left + right) / 2;
  162.                 int k = order_of_key(root, mid);
  163.                 if (mid - k == x && del[mid] == 0) {
  164.                     cout << mid + 1 << "\n";
  165.                     break;
  166.                 }
  167.                 if (mid - k <= x)
  168.                     left = mid;
  169.                 else
  170.                     right = mid;
  171.             }
  172.         }
  173.     }
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement