POJ 2104 主席树模板题
#include <iostream> #include <cstdio> #include <algorithm> int const maxn = 200010; using namespace std; int a[maxn], b[maxn]; //第几个版本的根节点编号 int root[maxn << 5]; int lc[maxn << 5], rc[maxn << 5], sum[maxn << 5]; int sz;//节点个数 int n, m; int true_n; void build(int &rt, int l, int r) { rt = ++sz; if (l == r) return; int mid = (l + r) >> 1; build(lc[rt], l, mid); build(rc[rt], mid + 1, r); } int update(int id, int l, int r, int pos) { int _id = ++sz; lc[_id] = lc[id], rc[_id] = rc[id], sum[_id] = sum[id] + 1; if (l == r) return _id; int mid = (r + l) >> 1; if (pos <= mid) lc[_id] = update(lc[id],