Advertisement
Guest User

Untitled

a guest
Feb 20th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int maxtree[800001];
  5. int mintree[800001];
  6. int tree[800001];
  7. int a[200001];
  8.  
  9. inline void Build(int node, int l, int r)
  10. {
  11.     if(l == r)
  12.     {
  13.         maxtree[node] = mintree[node] = a[l];
  14.         tree[node] = 1;
  15.     }
  16.     else
  17.     {
  18.         Build(node * 2, l, (l + r)/2);
  19.         Build(node * 2 + 1, (l + r)/2 + 1, r);
  20.         tree[node] = max(maxtree[node * 2 + 1] - mintree[node * 2] + 1, max(tree[node * 2], tree[node * 2 + 1]));
  21.         maxtree[node] = max(maxtree[node * 2], maxtree[node * 2 + 1]);
  22.         mintree[node] = min(mintree[node * 2], mintree[node * 2 + 1]);
  23.     }
  24. }
  25.  
  26. inline int GetMin(int node, int l, int r, int a, int b)
  27. {
  28.     //if(l > b || r < a)
  29.       //  return 1e9;
  30.      if(l >= a && r <= b)
  31.         return mintree[node];
  32.     else
  33.     {
  34.         int cur = 1e9;
  35.         if((l + r)/2 >= a)
  36.             cur = min(cur, GetMin(node * 2, l, (l + r)/2, a, b));
  37.         if((l + r)/2 + 1 <= b)
  38.             cur = min(cur, GetMin(node * 2 + 1, (l + r)/2 + 1, r, a, b));
  39.         return cur;
  40.     }
  41. }
  42.  
  43. inline int GetMax(int node, int l, int r, int a, int b)
  44. {
  45.     //if(l > b || r < a)
  46.     //    return 0;
  47.     if(l >= a && r <= b)
  48.         return maxtree[node];
  49.     else
  50.     {
  51.         int cur = 0;
  52.         if((l + r)/2 >= a)
  53.             cur = max(cur, GetMax(node * 2, l, (l + r)/2, a, b));
  54.         if((l + r)/2 + 1 <= b)
  55.             cur = max(cur, GetMax(node * 2 + 1, (l + r)/2 + 1, r, a, b));
  56.         return cur;
  57.     //    return max(GetMax(node * 2, l, (l + r)/2, a, b), GetMax(node * 2 +1, (l + r)/2 + 1, r, a, b));
  58.     }
  59. }
  60.  
  61. inline int GetAns(int node, int l, int r, int a, int b)
  62. {
  63.    // cout << node << '\n';
  64.     //if(l > b || r < a)
  65.       //  return 0;
  66.     if(l >= a && r <= b)
  67.         return tree[node];
  68.     else
  69.     {
  70.         int ans = 0, rmax = 0, lmin = 0;
  71.         if((l + r)/2 >= a)
  72.             ans = max(ans, GetAns(node * 2, l, (l + r)/2, a, b)), lmin = GetMin(node * 2,l , (l + r)/2, a, b);
  73.         if((l + r)/2 + 1 <= b)
  74.             ans = max(ans, GetAns(node * 2 + 1, (l + r)/2 + 1, r, a, b)), rmax = GetMax(node * 2 + 1, (l + r)/2 + 1, r, a, b);
  75.         if(lmin)
  76.             ans = max(ans, rmax - lmin + 1);
  77.         return ans;
  78.         //return max(max(, ),  - GetMin(node * 2, l, (l + r)/2, a, b) + 1);
  79.     }
  80. }
  81.  
  82. int main()
  83. {
  84.     freopen("taking-photos.in", "r", stdin);
  85.     freopen("taking-photos.out", "w", stdout);
  86.     ios_base::sync_with_stdio(false);
  87.     cin.tie(0);
  88.     cout.tie(0);
  89.     int n, k;
  90.     cin >> n >> k;
  91.     for(int i = 1; i <= n; i++)
  92.         cin >> a[i];
  93.     Build(1, 1, n);
  94.     while(k--)
  95.     {
  96.         int l, r;
  97.         cin >> l >> r;
  98.         cout << GetAns(1, 1, n, l, r) << '\n';
  99.     }
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement