Raslboyy

111240

Oct 13th, 2019
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.46 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.  
  27.     int get_val() { return val; }
  28.     int get_min() { return minn; }
  29.     int get_prior() { return prior; }
  30.     int get_size() { return size; }
  31.     void Swap() { swapp = !swapp; }
  32.     TreapNode* get_l() { relax(); return l; }
  33.     TreapNode* get_r() { relax(); return r; }
  34.     void set_l(TreapNode* l) { this->l = l; relax(); }
  35.     void set_r(TreapNode* r) { this->r = r; relax(); }
  36.  
  37. private:
  38.     int val;
  39.     int size;
  40.     int prior;
  41.     int minn;
  42.     bool swapp;
  43.     TreapNode* l;
  44.     TreapNode* r;
  45.     void relax();
  46. };
  47.  
  48. void TreapNode::relax() {
  49.     int size_l = (l == nullptr ? 0 : l->get_size());
  50.     int size_r = (r == nullptr ? 0 : r->get_size());
  51.     size = size_l + 1 + size_r;
  52.  
  53.     int min_l = (l == nullptr ? INT_MAX : l->get_min());
  54.     int min_r = (r == nullptr ? INT_MAX : r->get_min());
  55.     minn = min(val, min(min_l, min_r));
  56.  
  57.     if (swapp) {
  58.         swap(l, r);
  59.         if (l != nullptr) l->Swap();
  60.         if (r != nullptr) r->Swap();
  61.         Swap();
  62.     }
  63. }
  64.  
  65. class Treap {
  66. public:
  67.     Treap() : root(nullptr) {}
  68.     int Min(int l, int r);
  69.     void Swap(int l, int r);
  70.     void Add(int val) {
  71.         root = merge(root, new TreapNode(val));
  72.     };
  73. private:
  74.     TreapNode* root;
  75.     TreapNode* merge(TreapNode* t1, TreapNode* t2);
  76.     TreapNode* merge(TreapNode* t1, TreapNode* t2, TreapNode* t3);
  77.     tuple<TreapNode*, TreapNode*> split(TreapNode* t, int x);
  78.     tuple<TreapNode*, TreapNode*, TreapNode*> split(TreapNode* t, int l, int r);
  79. };
  80.  
  81. int Treap::Min(int l, int r) {
  82.     auto sp = split(root, l, r);
  83.     int res = get<1>(sp)->get_min();
  84.     root = merge(get<0>(sp), get<1>(sp), get<2>(sp));
  85.     return res;
  86. }
  87.  
  88. void Treap::Swap(int l, int r) {
  89.     auto sp = split(root, l, r);
  90.     get<1>(sp)->Swap();
  91.     root = merge(get<0>(sp), get<1>(sp), get<2>(sp));
  92. }
  93.  
  94. TreapNode* Treap::merge(TreapNode* t1, TreapNode* t2) {
  95.     if (t1 == nullptr) return t2;
  96.     if (t2 == nullptr) return t1;
  97.     if (t1->get_prior() > t2->get_prior()) {
  98.         t1->set_r(merge(t1->get_r(), t2));
  99.         return t1;
  100.     }
  101.     else {
  102.         t2->set_l(merge(t1, t2->get_l()));
  103.         return t2;
  104.     }
  105. }
  106. TreapNode* Treap::merge(TreapNode* t1, TreapNode* t2, TreapNode* t3) {
  107.     return merge(t1, merge(t2, t3));
  108. }
  109.  
  110. tuple<TreapNode*, TreapNode*> Treap::split(TreapNode* t, int x) {
  111.     if (t == nullptr) return make_tuple(nullptr, nullptr);
  112.     int size_l = (t->get_l() == nullptr ? 0 : t->get_l()->get_size());
  113.     if (x <= size_l) {
  114.         auto sp = split(t->get_l(), x);
  115.         t->set_l(get<1>(sp));
  116.         return make_tuple(get<0>(sp), t);
  117.     }
  118.     else {
  119.         auto sp = split(t->get_r(), x - size_l - 1);
  120.         t->set_r(get<0>(sp));
  121.         return make_tuple(t, get<1>(sp));
  122.     }
  123. }
  124. tuple<TreapNode*, TreapNode*, TreapNode*> Treap::split(TreapNode* t, int l, int r) {
  125.     auto sp1 = split(t, r + 1);
  126.     auto sp2 = split(get<0>(sp1), l);
  127.     return make_tuple(get<0>(sp2), get<1>(sp2), get<1>(sp1));
  128. }
  129.  
  130.  
  131.  
  132. int main() {
  133.     srand(time(NULL));
  134.  
  135.     int n, m;
  136.     fin >> n >> m;
  137.     Treap tr;
  138.     for (int i = 0; i < n; i++) {
  139.         int a; fin >> a;
  140.         tr.Add(a);
  141.     }
  142.     for (int i = 0; i < m; i++) {
  143.         int a; fin >> a;
  144.         int l, r; fin >> l >> r;
  145.         if (a == 1)
  146.             tr.Swap(--l, --r);
  147.         else {
  148.             fout << tr.Min(--l, --r) << endl;
  149.         }
  150.     }
  151.  
  152.     fin.close();
  153.     fout.close();
  154.     return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment