Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- struct treap {
- int key;
- int prior;
- int ind;
- treap *l;
- treap *r;
- treap *par;
- treap(int kkey, int kprior, int kind) {
- key = kkey;
- prior = kprior;
- ind = kind;
- l = r = par = nullptr;
- }
- };
- const int N = 5e4 + 20;
- vector< int > pt[N];
- vector< int > lt[N];
- vector< int > rt[N];
- treap *t;
- treap *p;
- void Insert(treap *cur) {
- if (!t) {
- p = cur;
- t = p;
- } else if (p->prior < cur->prior) {
- p->r = cur;
- p->r->par = p;
- p = p->r;
- } else {
- while (p->prior > cur->prior)
- if (p->par)
- p = p->par;
- else
- break;
- if (!p->par) {
- cur->l = p;
- p->par = cur;
- p = cur;
- } else {
- cur->l = p->r;
- p->r = cur;
- cur->par = p;
- p = cur;
- }
- }
- }
- int get_ind(treap *cur) {
- if (cur)
- return cur->ind;
- else
- return 0;
- }
- void print(treap *cur) {
- cout << cur->ind << "\n";
- if (!cur)
- return;
- print(cur->l);
- pt[cur->ind].push_back(get_ind(cur->par));
- lt[cur->ind].push_back(get_ind(cur->l));
- rt[cur->ind].push_back(get_ind(cur->r));
- print(cur->r);
- }
- int main() {
- // freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- int n;
- cin >> n;
- vector< pair< int, pair< int, int > > > v;
- for (int i = 1; i <= n; i++) {
- int x;
- int y;
- cin >> x >> y;
- v.push_back({x, {y, i}});
- }
- sort(v.begin(), v.end());
- for (int i = 0; i < v.size(); i++) {
- int x = v[i].first;
- int y = v[i].second.first;
- int index = v[i].second.second;
- treap *cur = new treap(x, y, index);
- Insert(cur);
- }
- cout << "YES\n" << t->ind;
- print(t);
- for (int i = 1; i <= n; i++)
- cout << pt[i][0] << " " << lt[i][0] << " " << rt[i][0] << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement