社区讨论
初学主席树,8pts求条(玄关)
P3919【模板】可持久化线段树 1(可持久化数组)参与者 5已保存回复 19
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 18 条
- 当前快照
- 1 份
- 快照标识符
- @mi4jrowm
- 此快照首次捕获于
- 2025/11/18 20:26 3 个月前
- 此快照最后确认于
- 2025/11/20 04:26 3 个月前
CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int maxn=4e7;
inline int read(){
char ch; int f = 1,res = 0; ch = getchar();
while (!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
while (isdigit(ch)) {res = res * 10 + (ch - '0'); ch = getchar();}
return res;
}
int n,q,a[maxn],root[maxn],tot=0;
struct node{
int ls,rs,val;
}tree[maxn];
int newnd(int id){
tot++; tree[tot] = tree[id];
return tot;
}
int mktr(int id,int L,int R){
tot++; id = tot;
if (L == R){
tree[id].val = a[L]; return tot;
}
int mid = (L + R) / 2;
tree[id].ls = mktr(tree[id].ls,L,mid);
tree[id].rs = mktr(tree[id].rs,mid + 1,R);
return id;
}
int update(int id,int L,int R,int x,int val){
id = newnd(id);
if (L == R) tree[id].val = val;
else{
int mid = (L + R) / 2;
if (x <= mid) tree[id].ls = update(tree[id].ls,L,mid,x,val);
else tree[id].rs = update(tree[id].rs,mid + 1,R,x,val);
}
return id;
}
int ask(int id,int L,int R,int x){
if (L == R) return tree[id].val;
else{
int mid = (L + R) / 2;
if (x <= mid) return ask(tree[id].ls,L,mid,x);
else return ask(tree[id].rs,mid + 1,R,x);
}
}
signed main(){
n = read(); q = read();
for (int i = 1;i <= n;i++) a[i] = read();
root[0] = mktr(0,1,n);
for (int i = 1;i <= q;i++){
int rt,m,x,y;
rt = read(); m = read(); x = read();
if(m == 1){
y = read(); root[i] = update(root[rt],1,n,x,y);
}else{
cout << ask(root[rt],1,n,x) << endl;
root[i] = root[rt];
}
}
return 0;
}
回复
共 19 条回复,欢迎继续交流。
正在加载回复...