Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. #define FILE "painter"
  9. int const INF = static_cast<const int>(1e9 + 100);
  10. struct Node {
  11.     Node *left = nullptr, *right = nullptr;
  12.     int key, prior, number;
  13.  
  14.     Node() : key(0), prior(0), number(0) {}
  15.  
  16.     explicit Node(int key, int prior, int number) : key(key), prior(prior), number(number), left(nullptr),
  17.                                                     right(nullptr) {}
  18. };
  19. struct Node2 {
  20.     int a, b, c;
  21. };
  22.  
  23. vector<Node2> ans;
  24. struct Node3 {
  25.     int first, second, third;
  26. };
  27. vector<Node3> zapr;
  28.  
  29. struct finder {
  30.     int size;
  31.     Node *head;
  32.  
  33.     explicit finder(int n) : size(n), head(nullptr) {}
  34.     void build() {
  35.         vector<Node*> stack;
  36. //        head = new Node(zapr[0].first, zapr[0].second, 1);
  37. //        stack.push_back(head);
  38.         for(int i = 0; i < size; i++) {
  39.             while(!stack.empty() && zapr[i].second < stack.back()->prior) {
  40.                 stack.pop_back();
  41.             }
  42.             if (!stack.empty()) {
  43.                 Node* t = new Node(zapr[i].first, zapr[i].second, zapr[i].third);
  44.                 t->left = stack.back()->right;
  45.                 stack.back()->right = t;
  46.                 stack.push_back(t);
  47.             } else {
  48.                 Node* t = new Node(zapr[i].first, zapr[i].second, zapr[i].third);
  49.                 t->left = head;
  50.                 head = t;
  51.                 stack.push_back(t);
  52.             }
  53.         }
  54.     }
  55.     pair<Node *, Node *> split(Node *v, int key) {
  56.         if (v == nullptr) {
  57.             return {nullptr, nullptr};
  58.         }
  59.         if (v->key < key) {
  60.             pair<Node *, Node *> t = split(v->right, key);
  61.             v->right = t.first;
  62.             return {v, t.second};
  63.         } else {
  64.             pair<Node *, Node *> t = split(v->left, key);
  65.             v->left = t.second;
  66.             return {t.first, v};
  67.         }
  68.     }
  69.  
  70.     void insert(int key, int prior, int i) {
  71.         head = _insert(head, key, prior, i);
  72.     }
  73.  
  74.     Node *_insert(Node *v, int key, int prior, int i) {
  75.         if (v == nullptr) {
  76.             return new Node(key, prior, i);
  77.         }
  78.         if (prior > v->prior) {
  79.             if (key > v->key) {
  80.                 v->right = _insert(v->right, key, prior, i);
  81.             } else {
  82.                 v->left = _insert(v->left, key, prior, i);
  83.             }
  84.             return v;
  85.         } else {
  86.             pair<Node *, Node *> t = split(v, key);
  87.             auto *inn = new Node(key, prior, i);
  88.             inn->left = t.first;
  89.             inn->right = t.second;
  90.             return inn;
  91.         }
  92.     }
  93.  
  94.     void print() {
  95.         _print(head, 0);
  96.     }
  97.  
  98.     void _print(Node *v, int p) {
  99.         if (v == nullptr) {
  100.             return;
  101.         }
  102.         Node2 t;
  103. //        Node* t = new Node;
  104. //        cout << v->number << " ";
  105. //        cout << p << " ";
  106.         t.a = p;
  107.         if (v->left == nullptr) {
  108. //            cout << 0 << " ";
  109.             t.b = 0;
  110.         } else {
  111. //            cout << v->left->number << " ";
  112.             t.b = v->left->number;
  113.         }
  114.         if (v->right == nullptr) {
  115.             t.c = 0;
  116. //            cout << 0 << "\n";
  117.         } else {
  118.             t.c = v->right->number;
  119. //            cout << v->right->number << "\n";
  120.         }
  121.         ans[v->number - 1] = t;
  122.         _print(v->left, v->number);
  123.         _print(v->right, v->number);
  124.     }
  125. };
  126.  
  127. istream& operator>>(istream& is, Node3 &d) {
  128.     cin >> d.first >> d.second;
  129.     return is;
  130. }
  131. bool comp(Node3& a, Node3 &b) {
  132.     return a.first < b.first;
  133. }
  134. int main() {
  135. //    ios_base::sync_with_stdio(0);
  136. //    cin.tie(0);
  137. //    cout.tie(0);
  138. #ifdef DEBUG
  139.     freopen("in.txt", "r", stdin);
  140.     freopen("out.txt", "w", stdout);
  141. #else
  142.     //    freopen("input.txt", "r", stdin);
  143.     //    freopen("output.txt", "w", stdout);
  144. #endif
  145.     int n;
  146.     cin >> n;
  147.     ans.resize(n);
  148.     finder tree(n);
  149.     zapr.resize(n);
  150.     for (int i = 0; i < n; i++) {
  151.         cin >> zapr[i];
  152.         zapr[i].third = i + 1;
  153.     }
  154.     sort(zapr.begin(), zapr.end(), comp);
  155.     tree.build();
  156.     tree.print();
  157.     cout << "YES\n";
  158.     for (int i = 0; i < n; i++) {
  159.         cout << ans[i].a << " " << ans[i].b << " " << ans[i].c;
  160.         if(i < n - 1) {
  161.             cout << "\n";
  162.         }
  163.     }
  164.     return 0;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement