Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #ifdef HOME
  4. #define db(x) cerr << #x << " = " << x << endl
  5. #define db3(x, y, z) cerr << "(" << #x << ", " << #y << ", " << #z << ") = (" << x << ", " << y << ", " << z << ")" << endl
  6. #define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")" << endl
  7. #define dbv(a) cerr << #a << " = "; for (auto xxx: a) cerr << xxx  << " "; cerr << endl
  8. #else
  9. #define db(x) ;
  10. #define db3(x, y, z) ;
  11. #define db2(x, y) ;
  12. #define dbv(a) ;
  13. #endif
  14.  
  15. using namespace std;
  16. typedef long long ll;
  17. typedef double dbl;
  18.  
  19. mt19937 rnd(clock());
  20.  
  21. const int INF = 1.01e9;
  22.  
  23.  
  24. struct item {
  25.     int key, prior;
  26.     int orig;
  27.     int f;
  28.     item * l, * r;
  29.     item() { }
  30.     item (int key, int prior, int orig) : key(key), prior(prior), orig(orig), f(1), l(NULL), r(NULL) { }
  31. };
  32. typedef item * pitem;
  33.  
  34. const int N = 2.1e5;
  35. item items[N];
  36.  
  37. void push(pitem t) {
  38.     if (t && t->f == -1) {
  39.         if (t->l) t->l->f *= -1;
  40.         if (t->r) t->r->f *= -1;
  41.         swap(t->l, t->r);
  42.         t->key *= -1;
  43.         t->f = 1;
  44.     }
  45. }
  46.  
  47. void split (pitem t, int key, pitem & l, pitem & r) {
  48.     push(t);
  49.     if (!t)
  50.         l = r = NULL;
  51.     else if (key <= t->key)
  52.         split (t->l, key, l, t->l),  r = t;
  53.     else
  54.         split (t->r, key, t->r, r),  l = t;
  55. }
  56.  
  57. void merge (pitem & t, pitem l, pitem r) {
  58.     push(l);
  59.     push(r);
  60.     if (!l || !r)
  61.         t = l ? l : r;
  62.     else if (l->prior > r->prior)
  63.         merge (l->r, l->r, r),  t = l;
  64.     else
  65.         merge (r->l, l, r->l),  t = r;
  66. }
  67.  
  68. pitem unite (pitem l, pitem r) {
  69.     push(l);
  70.     push(r);
  71.     if (!l || !r)  return l ? l : r;
  72.     if (l->prior < r->prior)  swap (l, r);
  73.     pitem lt = 0, rt = 0;
  74.     split (r, l->key, lt, rt);
  75.     l->l = unite (l->l, lt);
  76.     l->r = unite (l->r, rt);
  77.     return l;
  78. }
  79.  
  80. void print(pitem t) {
  81.     if (!t) return;
  82.     push(t);
  83.     print(t->l);
  84. //    cout << t->orig << "->" << t->key << " ";
  85.     cout << t->key << " ";
  86.     print(t->r);
  87. }
  88.  
  89. int main() {
  90. #ifdef HOME
  91.     assert(freopen("in", "r", stdin));
  92. #endif
  93.  
  94.     int n, q;
  95.     while (scanf("%d%d", &n, &q) == 2) {
  96.         vector<int> a(n);
  97.         for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  98.  
  99.         auto v = a;
  100.         sort(v.begin(), v.end());
  101.         v.resize(unique(v.begin(), v.end()) - v.begin());
  102.  
  103.         pitem t = 0;
  104.         for (int i = 0; i < (int)v.size(); i++) {
  105.             pitem cur = &items[i];
  106.             *cur = item(v[i], rnd(), v[i]);
  107.             merge(t, t, cur);
  108.         }
  109.  
  110. //        print(t); cout << endl;
  111.         for (int i = 0; i < q; i++) {
  112.             char c;
  113.             int x;
  114.             scanf(" %c%d", &c, &x);
  115.  
  116.             pitem t1 = 0, t2 = 0;
  117.             if (c == '<') {
  118.                 split(t, x, t1, t2);
  119.                 if (t1) t1->f *= -1;
  120.             } else {
  121.                 split(t, x + 1, t1, t2);
  122.                 if (t2) t2->f *= -1;
  123.             }
  124. //            print(t1); cout << endl;
  125. //            print(t2); cout << endl;
  126.             t = unite(t1, t2);
  127. //            print(t); cout << endl;
  128.         }
  129.         map<int, int> mp;
  130.         function<void(pitem)> go = [&](pitem cur) {
  131.             if (cur == 0) return;
  132.             push(cur);
  133.             mp[cur->orig] = cur->key;
  134.             go(cur->l);
  135.             go(cur->r);
  136.         };
  137.         go(t);
  138.         for (int &x : a) x = mp[x];
  139.  
  140.         for (int i= 0; i < n; i++) printf("%d%c", a[i], " \n"[i + 1 == n]);
  141.     }
  142.  
  143. #ifdef HOME
  144.     cerr << "time: " << clock() * 1.0 / CLOCKS_PER_SEC << endl;
  145. #endif
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement