Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define int long long
- struct Node{
- int ans, _min, _max;
- Node(){ans = -1; _min=1e9; _max=-1e9;}
- Node(int a, int b){
- ans = b;
- _min = a;
- _max = a;
- }
- };
- vector<Node> tree;
- vector<int> s;
- Node merge_(Node t1, Node t2){
- if(t1.ans == -1) return t2;
- if(t2.ans == -1) return t1;
- print2(t1);
- print2(t2);
- Node t;
- t.ans = max(t1.ans, max(t2.ans, max(t2._max - t1._min + 1, 0ll) ));
- t._min = min(t1._min, t2._min);
- t._max = max(t1._max, t2._max);
- print2(t);
- return t;
- }
- Node build(int l, int r, int v){
- if(l == r) return tree[v] = Node(s[l], 1);
- int m = (l + r) / 2;
- return tree[v] = merge_(build(l, m, 2 * v + 1), build(m + 1, r, 2* v + 2));
- }
- Node find_(int L, int R, int tl, int tr, int v){
- if(tl > R || tr < L) return Node(1, -1);
- if(L <= tl && tr <= R) return tree[v];
- int tm = (tl + tr) / 2;
- return merge_(find_(L, R, tl, tm, 2 * v + 1), find_(L, R, tm + 1, tr, 2 * v + 2));
- }
- signed main(){
- int n, m;
- cin >> n >> m;
- s.resize(n);
- for(int i = 0; i < n; ++i) cin >> s[i];
- tree.assign(4 * n + 4, Node(1, -1));
- build(0, n - 1, 0);
- int a, b;
- for(int i = 0; i < m; ++i){
- cin >> a >> b;
- --a;--b;
- Node q = find_(a, b, 0, n - 1, 0);
- cout << q.ans << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement