Advertisement
Guest User

Untitled

a guest
Jul 7th, 2015
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.31 KB | None | 0 0
  1.  
  2. #include<iostream>
  3. #include<vector>
  4. #include<algorithm>
  5. using namespace std;
  6. #define ll long long
  7. #define MAX 500100
  8. #define N -20000000000
  9. struct node
  10. {
  11. ll summa, max_sum, prefix, sufix;
  12. } t[4 * MAX];
  13.  
  14. void build(ll *a, ll v, ll tl, ll tr)
  15. {
  16. if (tl == tr) t[v].summa = t[v].max_sum = t[v].prefix = t[v].sufix = a[tl];
  17. else
  18. {
  19. ll tm = (tl + tr) / 2;
  20. build(a, v * 2, tl, tm);
  21. build(a, v * 2 + 1, tm + 1, tr);
  22. t[v].summa = t[v * 2].summa + t[v * 2 + 1].summa;
  23. t[v].prefix = max(t[v * 2].prefix, t[v * 2].summa + t[v * 2 + 1].prefix);
  24. t[v].sufix = max(t[v * 2+1].sufix, t[v * 2 + 1].summa + t[v * 2].sufix);
  25. t[v].max_sum = max(max(t[v * 2].max_sum, t[v * 2 + 1].max_sum), t[v * 2].sufix + t[v * 2 + 1].prefix);
  26. }
  27. }
  28.  
  29. ll sum(ll v, ll LeftPos, ll RightPos, ll Left, ll Right)
  30. {
  31. if (Left > Right) return N;
  32. if ((Left == LeftPos) && (Right == RightPos)) return t[v].summa;
  33. ll Middle = (LeftPos + RightPos) / 2;
  34. return sum(v * 2, LeftPos, Middle, Left, min(Right, Middle)) +
  35. sum(v * 2 + 1, Middle + 1, RightPos, max(Left, Middle + 1), Right);
  36. }
  37. ll Pr(ll v, ll LeftPos, ll RightPos, ll Left, ll Right)
  38. {
  39. if (Left > Right) return N;
  40. if ((Left == LeftPos) && (Right == RightPos)) return t[v].prefix;
  41. ll Middle = (LeftPos + RightPos) / 2;
  42. return max(Pr(v * 2, LeftPos, Middle, Left, min(Right, Middle)),
  43. sum(v * 2, LeftPos, Middle, Left, min(Right, Middle)) + Pr(v * 2 + 1, Middle + 1, RightPos, max(Left, Middle + 1), Right));
  44. }
  45. ll Sf(ll v, ll LeftPos, ll RightPos, ll Left, ll Right)
  46. {
  47. if (Left > Right) return N;
  48. if ((Left == LeftPos) && (Right == RightPos)) return t[v].sufix;
  49. ll Middle = (LeftPos + RightPos) / 2;
  50. return max(Sf(v * 2 + 1, Middle + 1, RightPos, max(Left, Middle + 1), Right),
  51. sum(v * 2 + 1, Middle + 1, RightPos, max(Left, Middle + 1), Right) + Sf(v * 2, LeftPos, Middle, Left, min(Right, Middle)));
  52. }
  53. ll Max(ll v, ll LeftPos, ll RightPos, ll Left, ll Right)
  54. {
  55. if (Left > Right) return N;
  56. if ((Left == LeftPos) && (Right == RightPos)) return t[v].max_sum;
  57. ll Middle = (LeftPos + RightPos) / 2;
  58. return max(max(Max(v * 2, LeftPos, Middle, Left, min(Right, Middle)) ,
  59. Max(v * 2 + 1, Middle + 1, RightPos, max(Left, Middle + 1), Right)), Sf(v * 2, LeftPos, Middle, Left, min(Right, Middle)) + Pr(v * 2 + 1, Middle + 1, RightPos, max(Left, Middle + 1), Right));
  60. }
  61.  
  62.  
  63. void update(ll v, ll LeftPos, ll RightPos, ll Position, ll NewValue)
  64. {
  65. if (LeftPos == RightPos) t[v].summa = t[v].max_sum = t[v].prefix = t[v].sufix = NewValue;
  66. else
  67. {
  68. ll Middle = (LeftPos + RightPos) / 2;
  69. if (Position <= Middle) update(v * 2, LeftPos, Middle, Position, NewValue);
  70. else update(v * 2 + 1, Middle + 1, RightPos, Position, NewValue);
  71. t[v].summa = t[v * 2].summa + t[v * 2 + 1].summa;
  72. t[v].prefix = max(t[v * 2].prefix, t[v * 2].summa + t[v * 2 + 1].prefix);
  73. t[v].sufix = max(t[v * 2 + 1].sufix, t[v * 2 + 1].summa + t[v * 2].sufix);
  74. t[v].max_sum = max(max(t[v * 2].max_sum, t[v * 2 + 1].max_sum), t[v * 2].sufix + t[v * 2 + 1].prefix);
  75. }
  76. }
  77. ll a[500100], n, m, x, y, M;
  78.  
  79. int main()
  80. {
  81. scanf("%lld", &n);
  82. for (ll i = 0; i < n; i++)
  83. {
  84. scanf("%lld", &a[i]);
  85. }
  86. build(a, 1, 0, n - 1);
  87. scanf("%lld", &m);
  88. for (ll i = 0; i < m; i++)
  89. {
  90. scanf("%lld", &x);
  91. scanf("%lld", &y);
  92. M = Max(1, 0, n-1, x-1, y-1);
  93. printf("%lld\n", M);
  94. }
  95. return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement