Guest User

Untitled

a guest
Apr 25th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.51 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <ctime>
  7. #include <cctype>
  8. #include <cstdlib>
  9. #include <cassert>
  10. #include <functional>
  11. #include <iomanip>
  12. #include <string>
  13. #include <cstring>
  14. #include <map>
  15. #include <set>
  16. #include <vector>
  17.  
  18. #define eps 1e-9
  19. #define inf int(1e9)
  20. #define inflong (long long)(1e18)
  21. #define forn(i, x, y) for (int i = (x); i <= (y); i++)
  22. #define ford(i, y, x) for (int i = (y); i >= (x); i--)
  23. #define sqr(a) ((a) * (a))
  24. #define abs(a) (((a) < 0) ? -(a) : (a))
  25. #define sz(a) (int)a.size()
  26. #define all(a) (a).begin(), (a).end()
  27. #define zero(a) memset(a, 0, sizeof(a))
  28. #define fst first
  29. #define snd second
  30. #define y1 osrughosduvgarligybakrybrogvba
  31. #define y0 aosfigdalrowgyalsouvgrlvygalri                              
  32. #define mp make_pair
  33. #define pb push_back
  34. #define taskname "reverse"
  35.  
  36. using namespace std;
  37.  
  38. typedef long long LL;
  39. typedef long double LD;
  40. typedef vector <int> vi;
  41. typedef vector <bool> vb;
  42. typedef vector <LL> vl;
  43. typedef pair<int, int> pii;
  44.  
  45. const int MaxN = int(2e5);
  46. const LD pi = 3.1415926535897932384626433832795;
  47.  
  48. struct node
  49. {
  50.   int l, r;
  51.   int x, y;
  52.   int size;
  53.   int mini;
  54.   bool rev;
  55.   node() {}
  56. };
  57.  
  58. int n, q;
  59. int a[MaxN];
  60. node Tree[MaxN * 4];
  61. int now = 1, root = 0;
  62.  
  63. int get(int p)
  64. {
  65.   return p ? Tree[p].size : 0;
  66. }
  67.  
  68. /*void swap(node &a, node &b)
  69. {
  70.   swap(a.l, b.l);
  71.   swap(a.r, b.r);
  72.   swap(a.size, b.size);
  73.   swap(a.x, b.x);
  74.   swap(a.y, b.y);
  75.   swap(a.mini, b.mini);
  76.   swap(a.rev, b.rev);
  77. }*/
  78.  
  79. void push(int p)
  80. {
  81.   if (!p || !Tree[p].rev)
  82.     return;
  83.   Tree[p].rev = false;
  84.   swap(Tree[p].l, Tree[p].r);
  85.   if (Tree[p].l)
  86.     Tree[Tree[p].l].rev ^= true;
  87.   if (Tree[p].r)
  88.     Tree[Tree[p].r].rev ^= true;
  89. }
  90.  
  91. void update_size(int p)
  92. {
  93.   push(p);
  94.   if (!p)
  95.     return;
  96.   Tree[p].size = 1 + get(Tree[p].l) + get(Tree[p].r);
  97.   Tree[p].mini = min(Tree[p].x, min(Tree[Tree[p].l].mini, Tree[Tree[p].r].mini));
  98. }
  99.  
  100. int merge(int L, int R)
  101. {
  102.   push(L);
  103.   push(R);
  104.   if (!L)
  105.     return R;
  106.   if (!R)
  107.     return L;
  108.   if (Tree[L].y < Tree[R].y)
  109.   {
  110.     int ans = merge(Tree[L].r, R);
  111.     Tree[L].r = ans;
  112.     update_size(L);
  113.     return L;
  114.   }
  115.   else
  116.   {
  117.     int ans = merge(L, Tree[R].l);
  118.     Tree[R].l = ans;
  119.     update_size(R);
  120.     return R;
  121.   }
  122.   return 0;
  123. }
  124.  
  125. pii split(int p, int pos)
  126. {
  127.   if (!p)
  128.     return mp(0, 0);
  129.   push(p);
  130.   if (Tree[Tree[p].l].size < pos)
  131.   {
  132.     pii tmp = split(Tree[p].r, pos);
  133.     Tree[p].r = tmp.fst;
  134.     update_size(p);
  135.     return mp(p, tmp.snd);
  136.   }
  137.   else
  138.   {
  139.     pii tmp = split(Tree[p].l, pos - 1 - Tree[Tree[p].l].size);
  140.     Tree[p].l = tmp.snd;
  141.     update_size(p);
  142.     return mp(tmp.fst, p);
  143.   }
  144.   return mp(0, 0);
  145. }
  146.  
  147. int CreateNode(int x)
  148. {
  149.   Tree[now].size = 1;
  150.   Tree[now].rev = false;
  151.   Tree[now].x = x;
  152.   Tree[now].y = rand();
  153.   Tree[now].l = Tree[now].r = 0;
  154.   Tree[now].mini = x;
  155.   return now++;
  156. }
  157.  
  158. void insert(int p, int pos, int y)
  159. {
  160.   push(p);
  161.   pii tmp = split(p, pos);
  162.   root = merge(merge(tmp.fst, CreateNode(y)), tmp.snd);  
  163. }
  164.  
  165. int get_min(int p, int x, int y)
  166. {
  167.   push(p);
  168.   if (y <= 0 || x > Tree[p].size)
  169.     return inf;
  170.   if (x <= 1 && y >= Tree[p].size)
  171.     return Tree[p].mini;
  172.   int res = min(get_min(Tree[p].l, x, y), get_min(Tree[p].r, x - Tree[Tree[p].l].size - 1, y - Tree[Tree[p].l].size - 1));
  173.   if (x <= Tree[Tree[p].l].size + 1 && y >= Tree[Tree[p].l].size + 1)
  174.     return min(Tree[p].x, res);
  175.   return res;
  176. }
  177.  
  178. void reverse_segment(int p, int l, int r)
  179. {
  180.   push(p);
  181.   pii t1 = split(p, l);
  182.   pii t2 = split(t1.snd, r - l + 1);
  183.   Tree[t2.fst].rev ^= true;
  184.   push(t2.fst);
  185.   root = merge(merge(t1.fst, t2.fst), t2.snd);
  186. }
  187.  
  188. void print(int p)
  189. {
  190.   if (!p)
  191.     return;
  192.   print(Tree[p].l);
  193.   printf("%d ", p);
  194.   print(Tree[p].r);
  195. }
  196.  
  197. int main()
  198. {
  199.   freopen(taskname".in", "r", stdin);
  200.   freopen(taskname".out", "w", stdout);
  201.   srand(time(NULL));
  202.   while (scanf("%d%d", &n, &q) >= 1)
  203.   {                            
  204.     Tree[0].l = Tree[0].r = Tree[0].size = 0;
  205.     Tree[0].mini = inf;
  206.     Tree[0].y = rand();
  207.     Tree[0].rev = false;
  208.     root = 0;
  209.     now = 1;
  210.     forn(i, 1, n)
  211.     {
  212.       scanf("%d", &a[i]);
  213.       insert(root, i, a[i]);
  214.     }
  215.     forn(i, 0, q - 1)
  216.     {
  217.       int type, l, r;
  218.       scanf("%d%d%d", &type, &l, &r);
  219.       assert(type >= 1 && type <= 2);
  220.       if (type == 1)  
  221.         reverse_segment(root, l, r);
  222.       else
  223.         printf("%d\n", get_min(root, l, r));
  224.     }              
  225.   }
  226.   return 0;
  227. }
Add Comment
Please, Sign In to add comment