Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int maxtree[800001];
- int mintree[800001];
- int tree[800001];
- int a[200001];
- inline void Build(int node, int l, int r)
- {
- if(l == r)
- {
- maxtree[node] = mintree[node] = a[l];
- tree[node] = 1;
- }
- else
- {
- Build(node * 2, l, (l + r)/2);
- Build(node * 2 + 1, (l + r)/2 + 1, r);
- tree[node] = max(maxtree[node * 2 + 1] - mintree[node * 2] + 1, max(tree[node * 2], tree[node * 2 + 1]));
- maxtree[node] = max(maxtree[node * 2], maxtree[node * 2 + 1]);
- mintree[node] = min(mintree[node * 2], mintree[node * 2 + 1]);
- }
- }
- inline int GetMin(int node, int l, int r, int a, int b)
- {
- //if(l > b || r < a)
- // return 1e9;
- if(l >= a && r <= b)
- return mintree[node];
- else
- {
- int cur = 1e9;
- if((l + r)/2 >= a)
- cur = min(cur, GetMin(node * 2, l, (l + r)/2, a, b));
- if((l + r)/2 + 1 <= b)
- cur = min(cur, GetMin(node * 2 + 1, (l + r)/2 + 1, r, a, b));
- return cur;
- }
- }
- inline int GetMax(int node, int l, int r, int a, int b)
- {
- //if(l > b || r < a)
- // return 0;
- if(l >= a && r <= b)
- return maxtree[node];
- else
- {
- int cur = 0;
- if((l + r)/2 >= a)
- cur = max(cur, GetMax(node * 2, l, (l + r)/2, a, b));
- if((l + r)/2 + 1 <= b)
- cur = max(cur, GetMax(node * 2 + 1, (l + r)/2 + 1, r, a, b));
- return cur;
- // return max(GetMax(node * 2, l, (l + r)/2, a, b), GetMax(node * 2 +1, (l + r)/2 + 1, r, a, b));
- }
- }
- inline int GetAns(int node, int l, int r, int a, int b)
- {
- // cout << node << '\n';
- //if(l > b || r < a)
- // return 0;
- if(l >= a && r <= b)
- return tree[node];
- else
- {
- int ans = 0, rmax = 0, lmin = 0;
- if((l + r)/2 >= a)
- ans = max(ans, GetAns(node * 2, l, (l + r)/2, a, b)), lmin = GetMin(node * 2,l , (l + r)/2, a, b);
- if((l + r)/2 + 1 <= b)
- 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);
- if(lmin)
- ans = max(ans, rmax - lmin + 1);
- return ans;
- //return max(max(, ), - GetMin(node * 2, l, (l + r)/2, a, b) + 1);
- }
- }
- int main()
- {
- freopen("taking-photos.in", "r", stdin);
- freopen("taking-photos.out", "w", stdout);
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- int n, k;
- cin >> n >> k;
- for(int i = 1; i <= n; i++)
- cin >> a[i];
- Build(1, 1, n);
- while(k--)
- {
- int l, r;
- cin >> l >> r;
- cout << GetAns(1, 1, n, l, r) << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement