Advertisement
Guest User

Untitled

a guest
Sep 19th, 2012
2,044
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <list>
  5. #include <deque>
  6. #include <stack>
  7. #include <queue>
  8. #include <set>
  9. #include <map>
  10. #include <bitset>
  11. #include <algorithm>
  12. #include <utility>
  13. #include <functional>
  14. #include <valarray>
  15. #include <cmath>
  16. #include <ctime>
  17. #include <cstdlib>
  18. #include <cstdio>
  19. #include <cctype>
  20. #include <cstring>
  21. #include <climits>
  22.  
  23. using namespace std;
  24.  
  25. #define REP(i, n) for(i = 0; i < (n); i++)
  26. #define FOR(i, a, n) for(i = a; i < n; i++)
  27. #define REV(i, a, n) for(i = a; i > n; i--)
  28.  
  29. template<typename T> T gcd(T a, T b) {
  30.     if(!b) return a;
  31.     return gcd(b, a % b);
  32. }
  33. template<typename T> T lcm(T a, T b) {
  34.     return a * b / gcd(a, b);
  35. }
  36.  
  37. typedef long long ll;
  38. typedef long double ld;
  39.  
  40. #define MAXN 50010
  41. #define INF 1000001000
  42.  
  43. int n, a[MAXN];
  44. int b, c, i, m, tmp, x;
  45.  
  46. struct data {
  47.     int sum, pref, suff, ans;
  48. };
  49.  
  50. data t[200000];
  51.  
  52. data combine (data l, data r) {
  53.     data res;
  54.     res.sum = l.sum + r.sum;
  55.     res.pref = max (l.pref, l.sum + r.pref);
  56.     res.suff = max (r.suff, r.sum + l.suff);
  57.     res.ans = max (max (l.ans, r.ans), l.suff + r.pref);
  58.     return res;
  59. }
  60.  
  61. data make_data (int val) {
  62.     data res;
  63.     res.sum = val;
  64.     res.pref = res.suff = res.ans = max(-1000000, val);
  65.     return res;
  66. }
  67.  
  68. void build (int a[], int v, int tl, int tr) {
  69.     if (tl == tr)
  70.         t[v] = make_data(a[tl]);
  71.     else {
  72.         int tm = (tl + tr) / 2;
  73.         build (a, v*2, tl, tm);
  74.         build (a, v*2+1, tm+1, tr);
  75.         t[v] = combine (t[v*2], t[v*2+1]);
  76.     }
  77. }
  78.  
  79. data query (int v, int tl, int tr, int l, int r) {
  80.     if (l == tl && tr == r)
  81.         return t[v];
  82.     int tm = (tl + tr) / 2;
  83.     if (r <= tm)
  84.         return query (v*2, tl, tm, l, r);
  85.     if (l > tm)
  86.         return query (v*2+1, tm+1, tr, l, r);
  87.     return combine (
  88.         query (v*2, tl, tm, l, tm),
  89.         query (v*2+1, tm+1, tr, tm+1, r)
  90.     );
  91. }
  92. int main(void) {
  93.     scanf("%d", &x);
  94.     REP(i, x) {
  95.         scanf("%d", &a[i+1]);
  96.     }
  97.     build(a, 1, 1, x+1);
  98.     scanf("%d", &m);
  99.     REP(i, m) {
  100.         scanf("%d%d", &b, &c);
  101.         printf("%d\n", query(1, 1, x+1, b, c).ans);
  102.     }
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement