【模板】可持久化线段树(主席树)
来源:互联网 发布:哲学视频讲座视频知乎 编辑:程序博客网 时间:2024/05/18 01:22
当修改线段树产生新的版本时,对于不需要修改的区间,直接指向原有的点,需要修改的区间,建立新点并连过去。 所以只需要维护m棵线段树的根,动态开点就可以了。
【模板】可持久化数组(可持久化线段树/平衡树) 洛谷P3919
#include<bits/stdc++.h>using namespace std;const int N=1e6+5;struct Node{ int val; Node *ch[2];}*root[N];int n,m,a[N];void build(Node *&root,int L,int R){ root=new Node; if(L==R){ root->val=a[L]; return; } int mid=L+R>>1; build(root->ch[0],L,mid); build(root->ch[1],mid+1,R);}void insert(Node* &root,int L,int R,int loc,int val){ Node *tmp=root; root=new Node; root->ch[0]=tmp->ch[0]; root->ch[1]=tmp->ch[1]; if(L==R) {root->val=val;return;} int mid=L+R>>1; if(loc<=mid) insert(root->ch[0],L,mid,loc,val); else insert(root->ch[1],mid+1,R,loc,val);}int Query(Node *root,int L,int R,int loc){ if(L==R) return root->val; int mid=L+R>>1; if(loc<=mid) return Query(root->ch[0],L,mid,loc); else return Query(root->ch[1],mid+1,R,loc);}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",&a[i]); build(root[0],1,n); for(int i=1;i<=m;++i){ int ver,opt; scanf("%d%d",&ver,&opt); root[i]=root[ver]; if(opt==1){ int loc,val; scanf("%d%d",&loc,&val); insert(root[i],1,n,loc,val); } else{ int loc; scanf("%d",&loc); printf("%d\n",Query(root[i],1,n,loc)); } } return 0;}
阅读全文
0 0
- 【模板】可持久化线段树 1(主席树)
- 【模板】可持久化线段树(主席树)
- 【洛谷3834】 【模板】可持久化线段树 (主席树)
- luoguP3834 【模板】可持久化线段树 1(主席树)
- 可持久化线段树(主席树)
- 主席树(可持久化线段树)入门专题
- 主席树(可持久化线段树)学习笔记
- 主席树(可持久化线段树)
- hdu2665主席树(可持久化线段树)
- 可持久化线段树(主席树)【数组】
- 可持久化线段树(主席树)
- 【模板】主席树/函数式线段树/可持久化线段树
- spoj3267 D-query 主席树(可持久化线段树)
- 【可持久化线段树】【主席树】[HDU4417]Super Mario
- [BZOJ2653] middle - 主席树(可持久化线段树) - 二分
- 主席树(可持久化线段树)学习笔记
- 主席树/可持久化线段树总结
- 可持久化线段树——主席树
- C++的输入优化
- 进程间通信之管道
- 配置mysql的主从复制
- Win10下的Java下载安装与环境配置
- 哈尔滨理工大学第七届程序设计竞赛决赛 D 数圈圈
- 【模板】可持久化线段树(主席树)
- 手记_轻松掌握MySQL数据库存储过程_咕泡
- 基本数据类型和引用数据类型的区别
- linux常用命令
- Java类加载器总结
- 第一个高级语言:FORTRAN
- Nepire的校OJ入门题解—蓝桥选拔篇(四)
- PCA
- 用CSS,制作“新闻标题”案例