可持久化线段树 (模板)
对于历史版本只要从根节点入手即可,在修改的过程中再把这一时间的子树建出来。
时间复杂度O(qlog(n+q))。
#include<bits/stdc++.h> using namespace std; int cnt=0; struct node { int l,r,v; }t[20000005]; int a[1000005],rt[1000005]; void build(int &p,int l,int r) { p=++cnt;if(l==r){t[p].v=a[l];return;} int m=(l+r)>>1; build(t[p].l,l,m);build(t[p].r,m+1,r); } void change(int &p,int x,int l,int r,int pos,int num) { p=++cnt;t[p].l=t[x].l;t[p].r=t[x].r;t[p].v=t[x].v; if(l==r){t[p].v=num;return ;} int m=(l+r)>>1; if(pos<=m)change(t[p].l,t[x].l,l,m,pos,num); else change(t[p].r,t[x].r,m+1,r,pos,num); } int query(int p,int l,int r,int pos) { if(l==r)return t[p].v; int m=(l+r)>>1; if(pos<=m)return query(t[p].l,l,m,pos); else return query(t[p].r,m+1,r,pos); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",&a[i]); build(rt[0],1,n); int tim,f,x,v; for(int i=1;i<=m;++i) { scanf("%d%d",&tim,&f); if(f==1){scanf("%d%d",&x,&v);change(rt[i],rt[tim],1,n,x,v);} else {scanf("%d",&x);printf("%d\n",query(rt[tim],1,n,x));rt[i]=rt[tim];} } return 0; }
- 可持久化线段树模板
- P3834 【模板】可持久化线段树 1(主席树)
- luogu P3834 【模板】可持久化线段树 1(主席树)
- luoguP3834 【模板】可持久化线段树 1(主席树)
- 【模板】可持久化线段树(主席树)
- 【模板】主席树/函数式线段树/可持久化线段树
- 【洛谷3834】 【模板】可持久化线段树 (主席树)
- 【模板】可持久化线段树
- 【模板】可持久化线段树 1(主席树)
- 各种树模板(splay,线段树,可持久化线段树...)
- 主席树练习1——P3834 【模板】可持久化线段树 1(主席树)
- 可持久化线段树 模板 【bzoj3932】任务查询系统
- 【模板】可持久化线段树 1(主席树)
- 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)
- P3834 【模板】可持久化线段树 1(主席树)
- 【模板】可持久化线段树(主席树)
- 【CJOJ2316】【模板】可持久化线段树
- 【模板】可持久化线段树 1(主席树)
- 可持久化数组(线段树)[模板题]
- 洛谷1531 线段树模板:区间最值