Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4.  
  5. struct Node{
  6. int ans, _min, _max;
  7. Node(){ans = -1; _min=1e9; _max=-1e9;}
  8. Node(int a, int b){
  9. ans = b;
  10. _min = a;
  11. _max = a;
  12. }
  13. };
  14. vector<Node> tree;
  15. vector<int> s;
  16.  
  17. Node merge_(Node t1, Node t2){
  18. if(t1.ans == -1) return t2;
  19. if(t2.ans == -1) return t1;
  20. print2(t1);
  21. print2(t2);
  22. Node t;
  23. t.ans = max(t1.ans, max(t2.ans, max(t2._max - t1._min + 1, 0ll) ));
  24. t._min = min(t1._min, t2._min);
  25. t._max = max(t1._max, t2._max);
  26. print2(t);
  27. return t;
  28. }
  29.  
  30. Node build(int l, int r, int v){
  31. if(l == r) return tree[v] = Node(s[l], 1);
  32. int m = (l + r) / 2;
  33. return tree[v] = merge_(build(l, m, 2 * v + 1), build(m + 1, r, 2* v + 2));
  34. }
  35.  
  36. Node find_(int L, int R, int tl, int tr, int v){
  37. if(tl > R || tr < L) return Node(1, -1);
  38. if(L <= tl && tr <= R) return tree[v];
  39. int tm = (tl + tr) / 2;
  40. return merge_(find_(L, R, tl, tm, 2 * v + 1), find_(L, R, tm + 1, tr, 2 * v + 2));
  41. }
  42.  
  43. signed main(){
  44. int n, m;
  45. cin >> n >> m;
  46. s.resize(n);
  47. for(int i = 0; i < n; ++i) cin >> s[i];
  48. tree.assign(4 * n + 4, Node(1, -1));
  49. build(0, n - 1, 0);
  50. int a, b;
  51. for(int i = 0; i < m; ++i){
  52. cin >> a >> b;
  53. --a;--b;
  54. Node q = find_(a, b, 0, n - 1, 0);
  55. cout << q.ans << '\n';
  56. }
  57. return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement