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/