Raslboyy

2791

Oct 12th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <ctime>
  4. #include <random>
  5. #include <tuple>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. ifstream fin("input.txt");
  11. ofstream fout("output.txt");
  12.  
  13. class TreapNode
  14. {
  15. public:
  16.     TreapNode(int val) : val(val), prior((rand() << 16) | rand()), size(1), l(nullptr), r(nullptr) {};
  17.     int get_size() { return size; }
  18.     int get_val() { return val; }
  19.     int get_prior() { return prior; }
  20.     TreapNode* get_l() { relax(); return l; }
  21.     TreapNode* get_r() { relax(); return r; }
  22.     void set_l(TreapNode* l) {
  23.         this->l = l;
  24.         relax();
  25.     }
  26.     void set_r(TreapNode* r) {
  27.         this->r = r;
  28.         relax();
  29.     }
  30.     void print();
  31. private:
  32.     int val;
  33.     int size;
  34.     int prior;
  35.     TreapNode* l;
  36.     TreapNode* r;
  37.     void relax();
  38. };
  39.  
  40. void TreapNode::relax() {
  41.     int lSize = (l == nullptr ? 0 : l->get_size());
  42.     int rSize = (r == nullptr ? 0 : r->get_size());
  43.     size = lSize + rSize + 1;
  44. }
  45.  
  46. void TreapNode::print() {
  47.     if (l != nullptr) l->print();
  48.     fout << val << " ";
  49.     if (r != nullptr) r->print();
  50. }
  51.  
  52. class Treap
  53. {
  54. public:
  55.     Treap() : root(nullptr) {}
  56.     void Print() { root->print(); }
  57.     void Add(int val) { root = merge(root, new TreapNode(val)); };
  58.     void To_Begin(int l, int r) {
  59.         auto sp = split(root, l, r);
  60.         root = merge(get<1>(sp), get<0>(sp), get<2>(sp));
  61.     };
  62. private:
  63.     TreapNode* root;
  64.     TreapNode* merge(TreapNode* t1, TreapNode* t2);
  65.     TreapNode* merge(TreapNode* t1, TreapNode* t2, TreapNode* t3);
  66.     tuple<TreapNode*, TreapNode*> split(TreapNode* t, int x);
  67.     tuple<TreapNode*, TreapNode*, TreapNode*> split(TreapNode* t, int l, int r);
  68. };
  69.  
  70. TreapNode* Treap::merge(TreapNode* t1, TreapNode* t2) {
  71.     if (t1 == nullptr) return t2;
  72.     if (t2 == nullptr) return t1;
  73.     if (t1->get_prior() > t2->get_prior()) {
  74.         t1->set_r(merge(t1->get_r(), t2));
  75.         return t1;
  76.     }
  77.     else {
  78.         t2->set_l(merge(t1, t2->get_l()));
  79.         return t2;
  80.     }
  81. }
  82. TreapNode* Treap::merge(TreapNode* t1, TreapNode* t2, TreapNode* t3) {
  83.     return merge(t1, merge(t2, t3));
  84. }
  85.  
  86. tuple<TreapNode*, TreapNode*> Treap::split(TreapNode* t, int x) {
  87.     if (t == nullptr) return make_tuple(nullptr, nullptr);
  88.     int size_l = (t->get_l() == nullptr ? 0 : t->get_l()->get_size());
  89.     if (x <= size_l) {
  90.         auto sp = split(t->get_l(), x);
  91.         t->set_l(get<1>(sp));
  92.         return make_tuple(get<0>(sp), t);
  93.     }
  94.     else {
  95.         auto sp = split(t->get_r(), x - size_l - 1);
  96.         t->set_r(get<0>(sp));
  97.         return make_tuple(t, get<1>(sp));
  98.     }
  99. }
  100. tuple<TreapNode*, TreapNode*, TreapNode*> Treap::split(TreapNode* t, int l, int r) {
  101.     auto sp1 = split(t, r + 1);
  102.     auto sp2 = split(get<0>(sp1), l);
  103.     return make_tuple(get<0>(sp2), get<1>(sp2), get<1>(sp1));
  104. }
  105.  
  106. int main() {
  107.  
  108.     srand(time(NULL));
  109.     int n, m;
  110.     fin >> n >> m;
  111.     Treap tr;
  112.     for (int i = 1; i <= n; i++) tr.Add(i);
  113.     for (int i = 0; i < m; i++) {
  114.         int l, r; fin >> l >> r;
  115.         tr.To_Begin(--l, --r);
  116.     }
  117.    
  118.     tr.Print();
  119.  
  120.     fin.close();
  121.     fout.close();
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment