Persistent Dynamic Segment Tree - YessineJallouli/Competitive-Programming GitHub Wiki

#include <bits/stdc++.h>
#define ll long long
#define SaveTime ios_base::sync_with_stdio(false), cin.tie(0);
using namespace std;

const int N = 1e5+7;
int neutral = 0;   //neutral element

struct node {
    int sum;
    node *l;
    node *r;
    node() {
        sum = neutral;
        l = NULL;
        r = NULL;
    }
    node(int _sum, node* _l, node* _r) {
        sum = _sum;
        l = _l;
        r = _r;
    }
};

inline int segment_sum(node * root)
{
    return root?root->sum:neutral;
}

node* mrg(node *n1, node *n2) {
    return new node(segment_sum(n1) + segment_sum(n2), n1, n2);
}

node* insert(node* root, int pos, int val, int ns = -1e9, int ne = 1e9) {
    if (pos < ns || pos > ne) {
        return root;
    }
    if (ns == ne) {
        return new node(segment_sum(root) + val, nullptr, nullptr);
    }
    if (root == NULL) {
        root = new node();
    }
    int md = (ns+ne)/2;
    node* n1 = insert(root->l, pos, val, ns, md);
    node* n2 = insert(root->r, pos, val, md+1, ne);
    return mrg(n1,n2);
}

int main() {
    SaveTime
    int n; cin >> n;
    node* roots[n+1];
    roots[0] = NULL;
    for (int i = 1; i <= n; i++) {
        int x; cin >> x;
        roots[i] = insert(roots[i-1], x,1);
    }
}

Problems :
https://www.spoj.com/problems/KQUERY/en/