Raslboyy

2791(построение за O(N) ? )

Oct 12th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <ctime>
  4. #include <random>
  5. #include <tuple>
  6. #include <algorithm>
  7. #include <vector>
  8.  
  9. using namespace std;
  10.  
  11. ifstream fin("input.txt");
  12. ofstream fout("output.txt");
  13.  
  14. class TreapNode
  15. {
  16. public:
  17.     TreapNode(int val, int prior) : val(val), prior(prior), size(1), l(nullptr), r(nullptr) {};
  18.     int get_size() { return size; }
  19.     int get_val() { return val; }
  20.     int get_prior() { return prior; }
  21.     TreapNode* get_l() { relax(); return l; }
  22.     TreapNode* get_r() { relax(); return r; }
  23.     TreapNode* get_p() { relax(); return p; }
  24.     void set_l(TreapNode* l) {
  25.         if (l != nullptr) l->set_p(this);
  26.         this->l = l;
  27.         relax();
  28.     }
  29.     void set_r(TreapNode* r) {
  30.         if (r != nullptr) r->set_p(this);
  31.         this->r = r;
  32.         relax();
  33.     }
  34.     void set_p(TreapNode* p) { this->p = p; }
  35.     void print();
  36. private:
  37.     int val;
  38.     int size;
  39.     int prior;
  40.     TreapNode* l;
  41.     TreapNode* r;
  42.     TreapNode* p;
  43.     void relax();
  44. };
  45.  
  46. void TreapNode::relax() {
  47.     int lSize = (l == nullptr ? 0 : l->get_size());
  48.     int rSize = (r == nullptr ? 0 : r->get_size());
  49.     size = lSize + rSize + 1;
  50. }
  51.  
  52. void TreapNode::print() {
  53.     if (l != nullptr) l->print();
  54.     fout << val << " ";
  55.     if (r != nullptr) r->print();
  56. }
  57.  
  58. class Treap
  59. {
  60. public:
  61.     Treap() : root(nullptr) {}
  62.     Treap(vector<int>* pvec);
  63.     void Print() { root->print(); }
  64.     /*void Add(int val) { root = merge(root, new TreapNode(val)); };*/
  65.     void To_Begin(int l, int r) {
  66.         auto sp = split(root, l, r);
  67.         root = merge(get<1>(sp), get<0>(sp), get<2>(sp));
  68.     };
  69. private:
  70.     TreapNode* root;
  71.     TreapNode* last;
  72.     TreapNode* merge(TreapNode* t1, TreapNode* t2);
  73.     TreapNode* merge(TreapNode* t1, TreapNode* t2, TreapNode* t3);
  74.     tuple<TreapNode*, TreapNode*> split(TreapNode* t, int x);
  75.     tuple<TreapNode*, TreapNode*, TreapNode*> split(TreapNode* t, int l, int r);
  76. };
  77.  
  78. Treap::Treap(vector<int>* pvec) {
  79.     auto vec = *pvec;
  80.     /*sort(vec.begin(), vec.end(), [](int a, int b) {
  81.         return a < b;
  82.         });*/
  83.     root = new TreapNode(vec[0], (rand() << 16) | rand());
  84.     last = root;
  85.     for (int i = 1; i < vec.size(); i++) {
  86.         int prior = (rand() << 16) | rand();
  87.         if (last->get_prior() > prior) {
  88.             last->set_r(new TreapNode(vec[i], prior));
  89.             last = last->get_r();
  90.         }
  91.         else {
  92.             TreapNode* cur = last;
  93.             while (cur->get_p() != nullptr && cur->get_prior() <= prior)
  94.                 cur = cur->get_p();
  95.             if (cur->get_prior() <= prior) {
  96.                 last = new TreapNode(vec[i], prior);
  97.                 last->set_l(cur);
  98.             }
  99.             else
  100.             {
  101.                 last = new TreapNode(vec[i], prior);
  102.                 last->set_l(cur->get_r());
  103.                 cur->set_r(last);
  104.             }
  105.         }
  106.     }
  107.     while (last->get_p() != nullptr)
  108.         last = last->get_p();
  109.     root = last;
  110. }
  111.  
  112. TreapNode* Treap::merge(TreapNode* t1, TreapNode* t2) {
  113.     if (t1 == nullptr) return t2;
  114.     if (t2 == nullptr) return t1;
  115.     if (t1->get_prior() > t2->get_prior()) {
  116.         t1->set_r(merge(t1->get_r(), t2));
  117.         return t1;
  118.     }
  119.     else {
  120.         t2->set_l(merge(t1, t2->get_l()));
  121.         return t2;
  122.     }
  123. }
  124. TreapNode* Treap::merge(TreapNode* t1, TreapNode* t2, TreapNode* t3) {
  125.     return merge(t1, merge(t2, t3));
  126. }
  127.  
  128. tuple<TreapNode*, TreapNode*> Treap::split(TreapNode* t, int x) {
  129.     if (t == nullptr) return make_tuple(nullptr, nullptr);
  130.     int size_l = (t->get_l() == nullptr ? 0 : t->get_l()->get_size());
  131.     if (x <= size_l) {
  132.         auto sp = split(t->get_l(), x);
  133.         t->set_l(get<1>(sp));
  134.         return make_tuple(get<0>(sp), t);
  135.     }
  136.     else {
  137.         auto sp = split(t->get_r(), x - size_l - 1);
  138.         t->set_r(get<0>(sp));
  139.         return make_tuple(t, get<1>(sp));
  140.     }
  141. }
  142. tuple<TreapNode*, TreapNode*, TreapNode*> Treap::split(TreapNode* t, int l, int r) {
  143.     auto sp1 = split(t, r + 1);
  144.     auto sp2 = split(get<0>(sp1), l);
  145.     return make_tuple(get<0>(sp2), get<1>(sp2), get<1>(sp1));
  146. }
  147.  
  148. int main() {
  149.  
  150.     srand(time(NULL));
  151.     int n, m;
  152.     fin >> n >> m;
  153.     vector<int> inp(n);
  154.     for (int i = 1; i <= n; i++) inp[i-1] = i;
  155.     Treap tr(&inp);
  156.     for (int i = 0; i < m; i++) {
  157.         int l, r; fin >> l >> r;
  158.         tr.To_Begin(--l, --r);
  159.     }
  160.    
  161.     tr.Print();
  162.  
  163.     fin.close();
  164.     fout.close();
  165.     return 0;
  166. }
Add Comment
Please, Sign In to add comment