Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- H. Переместить в начало
- */
- #include <bits/stdc++.h>
- using namespace std;
- // Декартово дерево
- struct item
- {
- item() {}
- item(int key, int priority) : key(key), priority(priority) {}
- int key, priority;
- int count = 1;
- item* l = nullptr;
- item* r = nullptr;
- };
- int getCount(const item* t)
- {
- return t ? t->count : 0;
- }
- void updateCount(item* t)
- {
- if (t)
- t->count = getCount(t->l) + getCount(t->r) + 1;
- }
- void split(item* t, const int key, item* &l, item* &r)
- {
- if (!t)
- l = r = nullptr;
- else if (getCount(t->l) >= key)
- {
- split(t->l, key, l, t->l);
- r = t;
- }
- else
- {
- split(t->r, key - getCount(t->l) - 1, t->r, r);
- l = t;
- }
- updateCount(t);
- }
- void insert(item* &t, item* it)
- {
- if (!t)
- t = it;
- else if (it->priority > t->priority)
- {
- split(t, it->key, it->l, it->r);
- t = it;
- }
- else
- insert(it->key < t->key ? t->l : t->r, it);
- updateCount(t);
- }
- item* merge(item* l, item* r)
- {
- if (!l || !r)
- return l ? l : r;
- if (l->priority > r->priority)
- {
- l->r = merge(l->r, r);
- updateCount(l);
- return l;
- }
- r->l = merge(l, r->l);
- updateCount(r);
- return r;
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- // будем выбирать приоритеты случайно с равномерным распределением
- random_device rd;
- mt19937 gen(rd());
- uniform_int_distribution<> dis(1, 1000000);
- item* treap = nullptr; // наше декартово дерево
- int n = 0;
- int m = 0;
- cin >> n >> m;
- for (int i = 1; i <= n; i++)
- {
- item* newItem = new item(i, dis(gen));
- insert(treap, newItem);
- }
- int l = 0;
- int r = 0;
- for (int i = 0; i < m; i++)
- {
- cin >> l >> r;
- l--; // смещение нумерации
- r--;
- item* left;
- item* tmp;
- item* middle;
- item* right;
- split(treap, l, left, tmp);
- split(tmp, r - l + 1, middle, right);
- left = merge(middle, left);
- treap = merge(left, right);
- }
- for (int i = 0; i < n; i++)
- {
- item* left;
- item* right;
- split(treap, 1, left, right);
- cout << left->key << ' ';
- treap = right;
- }
- return 0;
- }
- /*
- 6 3
- 2 4
- 3 5
- 2 2
- 1 4 5 2 3 6
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement