Advertisement
skimono

Dekartach po neyavnomu

Jul 9th, 2022
795
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.07 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <string>
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <stack>
  9. #include <iomanip>
  10. #include <fstream>
  11. #include <string>
  12. #include <set>
  13. #include <deque>
  14. #include <queue>
  15. #include <map>
  16. #include <bitset>
  17. #include <random>
  18. #include <list>
  19. #include <unordered_map>
  20. #include <unordered_set>
  21. #include <cassert>
  22.  
  23. using namespace std;
  24.  
  25. typedef long long ll;
  26. typedef unsigned long long ull;
  27. typedef long double ld;
  28. typedef string str;
  29. //typedef __int128 ultraint;
  30. #define endl "\n"
  31. #define sqrt sqrtl
  32. #define F first
  33. #define S second
  34. #define all(vc666) vc666.begin(), vc666.end()
  35. //#define pow fast_pow
  36. //#define Vec Point
  37.  
  38. const ll inf = (ll)1e18 + 7;
  39. ld EPS = 1e-9;
  40. ld Pi = 3.1415926535897932384;
  41.  
  42. struct dd2 {
  43.     struct Node {
  44.         ll priority;
  45.         ll value, size = 1;
  46.         Node* l = nullptr;
  47.         Node* r = nullptr;
  48.         Node(ll value) : priority(rand()), value(value){}
  49.     } *root = nullptr;
  50.     ll getSize(Node* n) {
  51.         return n ? n->size : 0;
  52.     }
  53.     void update(Node* n) {
  54.         if (n) {
  55.             n->size = getSize(n->l) + 1 + getSize(n->r);
  56.         }
  57.     }
  58.     Node* merge(Node* a, Node* b) {
  59.         if (!a || !b) {
  60.             return a ? a : b;
  61.         }
  62.         if (a->priority > b->priority) {
  63.             a->r = merge(a->r, b);
  64.             update(a);
  65.             return a;
  66.         }
  67.         else {
  68.             b->l = merge(a, b->l);
  69.             update(b);
  70.             return b;
  71.         }
  72.     }
  73.     void split(Node* n, ll k, Node*& a, Node*& b) {
  74.         if (!n) {
  75.             a = b = nullptr;
  76.             return;
  77.         }
  78.         if (getSize(n->l) < k) {
  79.             split(n->r, k - getSize(n->l) - 1, n->r, b);
  80.             a = n;
  81.         }
  82.         else {
  83.             split(n->l, k, a, n->l);
  84.             b = n;
  85.         }
  86.         update(a);
  87.         update(b);
  88.     }
  89.     ll get(ll index) {
  90.         Node* less, * equal, * greater;
  91.         split(root, index, less, greater);
  92.         split(greater, 1, equal, greater);
  93.         ll result = equal->value;
  94.         root = merge(merge(less, equal), greater);
  95.         return result;
  96.     }
  97.     void push_back(ll value) {
  98.         root = merge(root, new Node(value));
  99.     }
  100.     void push_front(ll value) {
  101.         root = merge(new Node(value), root);
  102.     }
  103.     void insert(ll index, ll value) {
  104.         Node *less, *greater;
  105.         split(root, index, less, greater);
  106.         root = merge(merge(less, new Node(value)), greater);
  107.     }
  108.     void erase(ll index) {
  109.         Node *less, *equal, *greater;
  110.         split(root, index, less, greater);
  111.         split(greater, 1, equal, greater);
  112.         root = merge(less, greater);
  113.     }
  114.     void erase(ll l, ll r) {
  115.         Node *less, *equal, *greater;
  116.         split(root, l, less, greater);
  117.         split(greater, r - l + 1, equal, greater);
  118.         root = merge(less, greater);
  119.     }
  120.     void toFront(ll l, ll r) {
  121.         Node* less, * equal, * greater;
  122.         split(root, l, less, greater);
  123.         split(greater, r - l + 1, equal, greater);
  124.         root = merge(merge(equal, less), greater);
  125.     }
  126.     ll size() {
  127.         return getSize(root);
  128.     }
  129. };
  130.  
  131. signed main() {
  132. #ifdef _DEBUG
  133.     freopen("in.txt", "r", stdin);
  134.     freopen("out.txt", "w", stdout);
  135. #endif
  136.     ios_base::sync_with_stdio(0);
  137.     cin.tie(NULL);
  138.     cout.tie(NULL);
  139.     ll t = 1;
  140.     //cin >> t;
  141.     while (t--) {
  142.         dd2 t;
  143.         ll n, q, i, j, l, r;
  144.         cin >> n >> q;
  145.         for (i = 1; i <= n; i++) {
  146.             t.push_back(i);
  147.         }
  148.         for (i = 0; i < q; i++) {
  149.             cin >> l >> r;
  150.             t.toFront(l - 1, r - 1);
  151.         }
  152.         for (i = 0; i < n; i++) {
  153.             cout << t.get(i) << " ";
  154.         }
  155.         cout << endl;
  156.     }
  157. }
  158. //痛みを受け入れる。 痛みを知っています。 痛みを感じる。 痛みを参照してください。 真の痛みを知らなければ、真の世界を理解することは不可能です。 今、あなたは痛みを知るでしょう。 神の罰!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement