luogu P3919 【模板】可持久化数组(可持久化线段树/平衡树)
2024-08-24 12:34:10
As you see
// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#include<algorithm>
inline int read () {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9'){if(c=='-')f=-1; c=getchar();}
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
return x*f;
}
const int maxn = 1000007;
int n,m,a[maxn],tot = 0,root[maxn];
struct Chairman_Tree {
int ch[2],num ;
} ;
Chairman_Tree t[maxn << 4];
#define lc t[x].ch[0]
#define rc t[x].ch[1]
void build(int & x,int l,int r) {
x = ++ tot;
if(l == r) {
t[x].num = a[l];return ;
}
int mid = l + r >> 1;
build(lc,l,mid); build(rc,mid+1,r);return ;
}
int query(int x,int l,int r,int pos) {
if(l == r) return t[x].num;
int mid = l + r >>1;
if(pos <= mid) return query(lc,l,mid,pos);
else return query(rc,mid+1,r,pos);
}
void modify(int pre,int &x,int l,int r,int pos,int w) {
t[x = ++tot] = t[pre];
if(l == r) {
t[x].num = w;return ;
}
int mid = l + r >> 1;
if(pos <= mid) modify(t[pre].ch[0],lc,l,mid,pos,w);
else modify(t[pre].ch[1],rc,mid + 1,r,pos,w);
}
int main () {
n = read(),m = read();
for(int i = 1;i <= n;++ i) a[i] = read();
build(root[0],1,n);
for(int T,op,a,b,i = 1;i <= m;++ i) {
T = read(),op = read();
if(op == 1) {
a = read(),b = read();
modify(root[T],root[i],1,n,a,b);
}
else {
a = read(),root[i] = root[T];
printf("%d\n",query(root[T],1,n,a));
}
}
return 0;
}
最新文章
- web前端学习随笔
- 生成树形结构的json字符串代码(c#)供前端angular tree使用.
- app端微信支付(二) - 生成预付单
- 纯css的防止图片撑破页面的代码(图片自动缩放)
- syslog-ng 学习心得与配置说明
- python生成中文验证码,带旋转,带干扰噪音线段
- PHP简单post验证绕过
- Farseer.Net
- python操作sqlite数据库
- CSS3:优雅地绘制不规则ICON
- linux下修改MAC地址方法
- ZeroMQ初探
- Intelligence System
- 深度学习word2vec笔记之基础篇
- io流的关闭顺序
- lease.go
- 西湖论剑2019-msc之奇怪的TTL
- Java中的4个并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger
- easyui combobox 在datagrid中动态加载数据
- 2018-2019-2 网络对抗技术 20165318 Exp2 后门原理与实践