Manioc

segment tree implicita

Feb 20th, 2019
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.16 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. #define MAX 100007
  3.  
  4. using namespace std;
  5.  
  6. struct node {
  7.     int val;
  8.     node* l, *r;
  9.     node() {}
  10.     node(node* _l, node* _r, int v) {
  11.         l = _l;
  12.         r = _r;
  13.         val = v;
  14.     }
  15. };
  16.  
  17. int arr[MAX];
  18. node* version[MAX];
  19.  
  20. node* update(node* no, int l, int r, int idx, int value) {
  21.     if (l == r) return new node(NULL, NULL, value);
  22.  
  23.     int mid = (l+r) / 2;
  24.     node* ret = new node(no->l, no->r, 0);
  25.     if (idx <= mid) ret->l = update(no->l, l, mid, idx, value);
  26.     else ret->r = update(no->r, mid+1, r, idx, value);  
  27.  
  28.     ret->val = ret->l->val + ret->r->val;
  29.     return ret;
  30. }
  31.  
  32. int query(node* no, int l, int r, int x, int y) {
  33.     if (x > r || y < l || l > r) return 0;
  34.     if (x <= l && r <= y) return no->val;
  35.  
  36.     int mid = (l+r) / 2;
  37.     return query(no->l,l, mid,l,r) +
  38.            query(no->r,mid+1,r,l,r);
  39. }
  40.  
  41. int main() {
  42.     node *root = new node(NULL, NULL, 0);
  43.     version[0] = root;
  44.     int n; cin >> n;
  45.     for(int i = 1; i <= n; i++) {
  46.         cin >> arr[i];
  47.         version[i] = update(version[i-1], 0, n-1, i, arr[i]);
  48.     }
  49.  
  50.     return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment