Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <algorithm>
- using namespace std;
- #define FILE "painter"
- int const INF = static_cast<const int>(1e9 + 100);
- struct Node {
- Node *left = nullptr, *right = nullptr;
- int key, prior, number;
- Node() : key(0), prior(0), number(0) {}
- explicit Node(int key, int prior, int number) : key(key), prior(prior), number(number), left(nullptr),
- right(nullptr) {}
- };
- struct Node2 {
- int a, b, c;
- };
- vector<Node2> ans;
- struct Node3 {
- int first, second, third;
- };
- vector<Node3> zapr;
- struct finder {
- int size;
- Node *head;
- explicit finder(int n) : size(n), head(nullptr) {}
- void build() {
- vector<Node*> stack;
- // head = new Node(zapr[0].first, zapr[0].second, 1);
- // stack.push_back(head);
- for(int i = 0; i < size; i++) {
- while(!stack.empty() && zapr[i].second < stack.back()->prior) {
- stack.pop_back();
- }
- if (!stack.empty()) {
- Node* t = new Node(zapr[i].first, zapr[i].second, zapr[i].third);
- t->left = stack.back()->right;
- stack.back()->right = t;
- stack.push_back(t);
- } else {
- Node* t = new Node(zapr[i].first, zapr[i].second, zapr[i].third);
- t->left = head;
- head = t;
- stack.push_back(t);
- }
- }
- }
- pair<Node *, Node *> split(Node *v, int key) {
- if (v == nullptr) {
- return {nullptr, nullptr};
- }
- if (v->key < key) {
- pair<Node *, Node *> t = split(v->right, key);
- v->right = t.first;
- return {v, t.second};
- } else {
- pair<Node *, Node *> t = split(v->left, key);
- v->left = t.second;
- return {t.first, v};
- }
- }
- void insert(int key, int prior, int i) {
- head = _insert(head, key, prior, i);
- }
- Node *_insert(Node *v, int key, int prior, int i) {
- if (v == nullptr) {
- return new Node(key, prior, i);
- }
- if (prior > v->prior) {
- if (key > v->key) {
- v->right = _insert(v->right, key, prior, i);
- } else {
- v->left = _insert(v->left, key, prior, i);
- }
- return v;
- } else {
- pair<Node *, Node *> t = split(v, key);
- auto *inn = new Node(key, prior, i);
- inn->left = t.first;
- inn->right = t.second;
- return inn;
- }
- }
- void print() {
- _print(head, 0);
- }
- void _print(Node *v, int p) {
- if (v == nullptr) {
- return;
- }
- Node2 t;
- // Node* t = new Node;
- // cout << v->number << " ";
- // cout << p << " ";
- t.a = p;
- if (v->left == nullptr) {
- // cout << 0 << " ";
- t.b = 0;
- } else {
- // cout << v->left->number << " ";
- t.b = v->left->number;
- }
- if (v->right == nullptr) {
- t.c = 0;
- // cout << 0 << "\n";
- } else {
- t.c = v->right->number;
- // cout << v->right->number << "\n";
- }
- ans[v->number - 1] = t;
- _print(v->left, v->number);
- _print(v->right, v->number);
- }
- };
- istream& operator>>(istream& is, Node3 &d) {
- cin >> d.first >> d.second;
- return is;
- }
- bool comp(Node3& a, Node3 &b) {
- return a.first < b.first;
- }
- int main() {
- // ios_base::sync_with_stdio(0);
- // cin.tie(0);
- // cout.tie(0);
- #ifdef DEBUG
- freopen("in.txt", "r", stdin);
- freopen("out.txt", "w", stdout);
- #else
- // freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- #endif
- int n;
- cin >> n;
- ans.resize(n);
- finder tree(n);
- zapr.resize(n);
- for (int i = 0; i < n; i++) {
- cin >> zapr[i];
- zapr[i].third = i + 1;
- }
- sort(zapr.begin(), zapr.end(), comp);
- tree.build();
- tree.print();
- cout << "YES\n";
- for (int i = 0; i < n; i++) {
- cout << ans[i].a << " " << ans[i].b << " " << ans[i].c;
- if(i < n - 1) {
- cout << "\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement