Guest User

Untitled

a guest
Jan 11th, 2015
868
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <vector>
  4. #include <stdlib.h>
  5.  
  6. using namespace std;
  7.  
  8. const int INF = (int)1e9;
  9.  
  10. struct Node {
  11.     int L, R, val, mn, sz, rev, prior;
  12.     Node(int x) {
  13.         val = mn = x;
  14.         sz = 1;
  15.         rev = R = L = 0;
  16.         prior = rand() | (rand() << 16);
  17.     }
  18.     Node() {
  19.         prior = rev = sz = L = R = 0;
  20.         val = mn = INF;
  21.     }
  22. };
  23.  
  24. struct Treap {
  25.     vector<Node> A;
  26.     int t;
  27.     Treap() {
  28.         A.clear();
  29.         A.push_back(Node());
  30.         t = 0;
  31.     }
  32.     void add(int x) {
  33.         A.push_back(Node(x));
  34.         t = merge_(t, (int)A.size() - 1);
  35.     }
  36.     void push(int v) {
  37.         if (A[v].rev) {
  38.             A[A[v].L].rev ^= 1;
  39.             A[A[v].R].rev ^= 1;
  40.             A[v].rev = 0;
  41.             swap(A[v].L, A[v].R);
  42.         }
  43.     }
  44.     void norm(int v) {
  45.         if (v == 0) return;
  46.         A[v].mn = min(A[v].val, min(A[A[v].L].mn, A[A[v].R].mn));
  47.         A[v].sz = A[A[v].L].sz + A[A[v].R].sz + 1;
  48.     }
  49.     int merge_(int L, int R) {
  50.         if (!L || !R) {
  51.             return L + R;
  52.         }
  53.         int T = 0;
  54.         if (A[L].prior < A[R].prior) {
  55.             push(L);
  56.             A[L].R = merge_(A[L].R, R);
  57.             T = L;
  58.         } else {
  59.             push(R);
  60.             A[R].L = merge_(L, A[R].L);
  61.             T = R;
  62.         }
  63.         norm(T);
  64.         return T;
  65.     }
  66.     void split(int T, int &L, int &R,  int ii) {
  67.         if (!T) {
  68.             R = L = 0;
  69.             return;
  70.         }
  71.         push(T);
  72.         if (A[A[T].L].sz >= ii) {
  73.             split(A[T].L, L, A[T].L, ii);
  74.             R = T;
  75.         } else {
  76.             split(A[T].R, A[T].R, R, ii - A[A[T].L].sz - 1);
  77.             L = T;
  78.         }
  79.         norm(T);
  80.     }
  81.     void rotate_(int l, int r) {
  82.         int a, b, c;
  83.         split(t, a, b, l);
  84.         split(b, b, c, r - l + 1);
  85.         A[b].rev = 1;
  86.         t = merge_(a, merge_(b, c));
  87.     }
  88.     int getMin(int l, int r) {
  89.         int a, b, c;
  90.         split(t, a, b, l);
  91.         split(b, b, c, r - l + 1);
  92.         int res = A[b].mn;
  93.         t = merge_(a, merge_(b, c));
  94.         return res;
  95.     }
  96. };
  97.  
  98. int main() {
  99.     int n, q;
  100.     cin >> n >> q;
  101.     Treap T;
  102.     while (n--) {
  103.         int x;
  104.         cin >> x;
  105.         T.add(x);
  106.     }
  107.     while(q--) {
  108.         int t, l, r;
  109.         cin >> t >> l >> r;
  110.         l--, r--;
  111.         if (t == 1) {
  112.             T.rotate_(l, r);
  113.         }
  114.         if (t == 2) {
  115.             cout << T.getMin(l, r) << endl;
  116.         }
  117.     }
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment