Raslboyy

111240 (Построение за O(N))

Oct 13th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.59 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. #include <climits>
  9.  
  10. using namespace std;
  11.  
  12. ifstream fin("input.txt");
  13. ofstream fout("output.txt");
  14.  
  15. class TreapNode
  16. {
  17. public:
  18.     TreapNode(int val) :
  19.         val(val),
  20.         size(1),
  21.         prior(rand() | (rand() << 16)),
  22.         minn(val),
  23.         swapp(0),
  24.         l(nullptr),
  25.         r(nullptr) {}
  26.     TreapNode(int val, int prior) :
  27.         val(val),
  28.         size(1),
  29.         prior(prior),
  30.         minn(val),
  31.         swapp(0),
  32.         l(nullptr),
  33.         r(nullptr),
  34.         p(nullptr) {}
  35.  
  36.     int get_val() { return val; }
  37.     int get_min() { return minn; }
  38.     int get_prior() { return prior; }
  39.     int get_size() { return size; }
  40.     void Swap() { swapp = !swapp; }
  41.     TreapNode* get_l() { relax(); return l; }
  42.     TreapNode* get_r() { relax(); return r; }
  43.     TreapNode* get_p() { relax(); return p; }
  44.     void set_l(TreapNode* l) {
  45.         if (l != nullptr) l->set_p(this);
  46.         this->l = l; relax();
  47.     }
  48.     void set_r(TreapNode* r) {
  49.         if (r != nullptr) r->set_p(this);
  50.         this->r = r; relax();
  51.     }
  52.     void set_p(TreapNode* p) {
  53.         this->p = p;
  54.     }
  55.  
  56. private:
  57.     int val;
  58.     int size;
  59.     int prior;
  60.     int minn;
  61.     bool swapp;
  62.     TreapNode* l;
  63.     TreapNode* r;
  64.     TreapNode* p;
  65.     void relax();
  66. };
  67.  
  68. void TreapNode::relax() {
  69.     int size_l = (l == nullptr ? 0 : l->get_size());
  70.     int size_r = (r == nullptr ? 0 : r->get_size());
  71.     size = size_l + 1 + size_r;
  72.  
  73.     int min_l = (l == nullptr ? INT_MAX : l->get_min());
  74.     int min_r = (r == nullptr ? INT_MAX : r->get_min());
  75.     minn = min(val, min(min_l, min_r));
  76.  
  77.     if (swapp) {
  78.         swap(l, r);
  79.         if (l != nullptr) l->Swap();
  80.         if (r != nullptr) r->Swap();
  81.         Swap();
  82.     }
  83. }
  84.  
  85. class Treap {
  86. public:
  87.     Treap() : root(nullptr) {}
  88.     Treap(vector<int> *pvec);
  89.     int Min(int l, int r);
  90.     void Swap(int l, int r);
  91.     void Add(int val) {
  92.         root = merge(root, new TreapNode(val));
  93.     };
  94. private:
  95.     TreapNode* root;
  96.     TreapNode* last;
  97.     TreapNode* merge(TreapNode* t1, TreapNode* t2);
  98.     TreapNode* merge(TreapNode* t1, TreapNode* t2, TreapNode* t3);
  99.     tuple<TreapNode*, TreapNode*> split(TreapNode* t, int x);
  100.     tuple<TreapNode*, TreapNode*, TreapNode*> split(TreapNode* t, int l, int r);
  101. };
  102.  
  103. Treap::Treap(vector<int>* pvec) {
  104.     auto vec = *pvec;
  105.    
  106.     root = new TreapNode(vec[0], (rand() << 16) | rand());
  107.     last = root;
  108.     for (int i = 1; i < vec.size(); i++) {
  109.         int prior = (rand() << 16) | rand();
  110.         if (last->get_prior() > prior) {
  111.             last->set_r(new TreapNode(vec[i], prior));
  112.             last = last->get_r();
  113.         }
  114.         else {
  115.             TreapNode* cur = last;
  116.             while (cur->get_p() != nullptr && cur->get_prior() <= prior)
  117.                 cur = cur->get_p();
  118.             if (cur->get_prior() <= prior) {
  119.                 last = new TreapNode(vec[i], prior);
  120.                 last->set_l(cur);
  121.             }
  122.             else {
  123.                 last = new TreapNode(vec[i], prior);
  124.                 last->set_l(cur->get_r());
  125.                 cur->set_r(last);
  126.             }
  127.         }
  128.     }
  129.     while (last->get_p() != nullptr) last = last->get_p();
  130.     root = last;
  131. }
  132.  
  133. int Treap::Min(int l, int r) {
  134.     auto sp = split(root, l, r);
  135.     int res = get<1>(sp)->get_min();
  136.     root = merge(get<0>(sp), get<1>(sp), get<2>(sp));
  137.     return res;
  138. }
  139.  
  140. void Treap::Swap(int l, int r) {
  141.     auto sp = split(root, l, r);
  142.     get<1>(sp)->Swap();
  143.     root = merge(get<0>(sp), get<1>(sp), get<2>(sp));
  144. }
  145.  
  146. TreapNode* Treap::merge(TreapNode* t1, TreapNode* t2) {
  147.     if (t1 == nullptr) return t2;
  148.     if (t2 == nullptr) return t1;
  149.     if (t1->get_prior() > t2->get_prior()) {
  150.         t1->set_r(merge(t1->get_r(), t2));
  151.         return t1;
  152.     }
  153.     else {
  154.         t2->set_l(merge(t1, t2->get_l()));
  155.         return t2;
  156.     }
  157. }
  158. TreapNode* Treap::merge(TreapNode* t1, TreapNode* t2, TreapNode* t3) {
  159.     return merge(t1, merge(t2, t3));
  160. }
  161.  
  162. tuple<TreapNode*, TreapNode*> Treap::split(TreapNode* t, int x) {
  163.     if (t == nullptr) return make_tuple(nullptr, nullptr);
  164.     int size_l = (t->get_l() == nullptr ? 0 : t->get_l()->get_size());
  165.     if (x <= size_l) {
  166.         auto sp = split(t->get_l(), x);
  167.         t->set_l(get<1>(sp));
  168.         return make_tuple(get<0>(sp), t);
  169.     }
  170.     else {
  171.         auto sp = split(t->get_r(), x - size_l - 1);
  172.         t->set_r(get<0>(sp));
  173.         return make_tuple(t, get<1>(sp));
  174.     }
  175. }
  176. tuple<TreapNode*, TreapNode*, TreapNode*> Treap::split(TreapNode* t, int l, int r) {
  177.     auto sp1 = split(t, r + 1);
  178.     auto sp2 = split(get<0>(sp1), l);
  179.     return make_tuple(get<0>(sp2), get<1>(sp2), get<1>(sp1));
  180. }
  181.  
  182.  
  183.  
  184. int main() {
  185.     srand(time(NULL));
  186.  
  187.     int n, m;
  188.     fin >> n >> m;
  189.     vector<int> inp(n);
  190.     for (int i = 0; i < n; i++) fin >> inp[i];
  191.     Treap tr(&inp);
  192.     for (int i = 0; i < m; i++) {
  193.         int a; fin >> a;
  194.         int l, r; fin >> l >> r;
  195.         if (a == 1)
  196.             tr.Swap(--l, --r);
  197.         else {
  198.             fout << tr.Min(--l, --r) << endl;
  199.         }
  200.     }
  201.  
  202.     fin.close();
  203.     fout.close();
  204.     return 0;
  205. }
Add Comment
Please, Sign In to add comment