Advertisement
Guest User

Persistent Tree

a guest
Nov 26th, 2014
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define pb push_back
  5. #define mp make_pair
  6. #define sz(a) (int)a.size()
  7. #define ms(a, x) memset(a, x, sizeof a)
  8. #define all(a) a.begin(), a.end()
  9.  
  10. typedef long long ll;
  11. typedef pair<int,int> pt;
  12.  
  13. const int inf = 1<<30;
  14. const int N = 1<<17;
  15.  
  16. int a[N], nxt[N];
  17. bool *used = new bool[2000001];
  18. int *last = new int[2000001];
  19.  
  20. struct node {
  21.     node *l, *r;
  22.     ll mx, pref, suff, sum;
  23.     node() : mx(0), pref(0), suff(0), sum(0), l(NULL), r(NULL) {}
  24.     node(ll val) : mx(val), pref(val), suff(val), sum(val), l(NULL), r(NULL) {}
  25.     node(node *l, node *r) : l(l), r(r) {
  26.         mx = max(l->mx, r->mx);
  27.         mx = max(mx, l->suff + r->pref);
  28.         pref = max(l->pref, l->sum + r->pref);
  29.         suff = max(r->suff, r->sum + l->suff);
  30.         sum = l->sum + r->sum;
  31.     }
  32. } *root[N];
  33.  
  34. node *build(int l, int r) {
  35.     if (l + 1 == r) {
  36.         if (!used[a[l]]) {
  37.             used[a[l]] = 1;
  38.             return new node(a[l]);
  39.         } else {
  40.             return new node(0);
  41.         }
  42.     } else {
  43.         int mid = (l + r) >> 1;
  44.         return new node(build(l, mid), build(mid, r));
  45.     }
  46. }
  47.  
  48. node *update(node *v, int l, int r, int pos, int val) {
  49.     if (l + 1 == r) {
  50.         return new node(val);
  51.     } else {
  52.         int mid = (l + r) >> 1;
  53.         if (pos < mid) {
  54.             return new node(update(v->l, l, mid, pos, val), v->r);
  55.         } else {
  56.             return new node(v->l, update(v->r, mid, r, pos, val));
  57.         }
  58.     }
  59. }
  60.  
  61. node *get(node *v, int l, int r, int L, int R) {
  62.     if (R <= l || r <= L) return new node(-inf);
  63.     if (L <= l && r <= R) {
  64.         return v;
  65.     } else {
  66.         int mid = (l + r) >> 1;
  67.         return new node(get(v->l, l, mid, L, R), get(v->r, mid, r, L, R));
  68.     }
  69. }
  70.  
  71. void out(node *v, int l, int r) {
  72.     if (l + 1 == r) {
  73.         printf("%lld ", v->sum);
  74.     } else {
  75.         int mid = (l + r) >> 1;
  76.         out(v->l, l, mid);
  77.         out(v->r, mid, r);
  78.     }
  79. }
  80.  
  81. int main() {
  82.     #ifdef LOCAL
  83.     freopen("a.in", "r", stdin);
  84.     freopen("a.out", "w", stdout);
  85.     #endif
  86.  
  87.     int n;
  88.     scanf("%d", &n);
  89.     for (int i = 0; i < n; i++) {
  90.         scanf("%d", a + i);
  91.     }
  92.  
  93.     used += (int)1e6;
  94.     last += (int)1e6;
  95.  
  96.     for (int i = n-1; i >= 0; i--) {
  97.         nxt[i] = last[a[i]];
  98.         last[a[i]] = i;
  99.     }
  100.  
  101.     root[0] = build(0, n);
  102.  
  103.     for (int i = 0; i+1 < n; i++) {
  104.         if (nxt[i] == 0) {
  105.             root[i+1] = update(root[i], 0, n, i, 0);
  106.         } else {
  107.             root[i+1] = update(root[i], 0, n, nxt[i], a[i]);
  108.             root[i+1] = update(root[i+1], 0, n, i, 0);
  109.         }
  110.     }
  111.  
  112.     for (int i = 0; i < n; i++) {
  113.         out(root[i], 0, n);
  114.         printf("\n");
  115.     }
  116.  
  117.     int m;
  118.     scanf("%d", &m);
  119.     for (int i = 0, l, r; i < m; i++) {
  120.         scanf("%d %d", &l, &r); l--;
  121.         printf("%lld\n", get(root[l], 0, n, l, r)->mx);
  122.     }
  123.  
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement