可持久化线段树
struct Node { int val; Node *ch[2]; }; int a[maxn], n; Node *root[maxn]; Node* sgtIns(Node* q, int pos) { // 在q的基础上将pos这个位置的数+1, 并返回一个新的线段树的根 int l = 0, r = n; Node *s = new Node, *p = s; while (l < r) { p->val = q ? q->val + 1 : 1; int mid = (l + r)>> 1; if (pos <= mid) { p->ch[1] = q ? q->ch[1] : 0; p = p->ch[0] = new Node; q = q ? q->ch[0] : 0; r = mid; } else { p->ch[0] = q ? q->ch[0] : 0; p = p->ch[1] = new Node; q = q ? q->ch[1] : 0; l = mid + 1; } } p->val = q ? q->val + 1 : 1; return s; } int main() { cin >> n; for (int i = 1; i <= n; ++ i) { cin >> a[i]; } root[0] = 0; for (int i = 1; i <= n; ++ i) { root[i] = sgtIns(root[i - 1], a[i]); } }