社区讨论
主席树求调一下
P3919【模板】可持久化线段树 1(可持久化数组)参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lrxiw6zc
- 此快照首次捕获于
- 2024/01/28 21:14 2 年前
- 此快照最后确认于
- 2024/01/28 23:05 2 年前
呃呃呃我之前打过主席树,后来又忘了
又打了一份就死了
CPP#include<bits/stdc++.h>
#define lc t[q].ls
#define rc t[q].rs
#define mid ((l+r)/2)
#define int long long
using namespace std;
int n,m,a[0x66ccff],tot,root[0x66ccff];
inline int read(){
int f=1,x=0;char ch;
while(ch<'0'||ch>'9'){ch=getchar();if(ch=='-')f=-1;};
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();};
return f*x;
}
struct node{
int l,r,ls,rs;
int lazy,dat;
}t[0x66ccff];
void build(int &q, int l, int r){
q=++tot;
if(l==r){
t[q].dat=a[l];
return;
}
build(lc,l,mid);
build(rc,mid+1,r);
}
inline void insert(int &qwq,int q,int l,int r,int i,int val){
qwq=++tot;
t[q].l=l;t[q].r=r;
if(l==r){
t[q].dat=val;
return;
}
if(i<=mid) insert(t[qwq].ls,lc,l,mid,i,val);
else insert(t[qwq].rs,rc,mid+1,r,i,val);
t[q].dat=t[lc].dat+t[rc].dat;
}
inline int ask(int q,int l,int r){
if(!q) return 0;
if(t[q].l>r||t[q].r<l) return 0;
if(t[q].l>=l&&t[q].r<=r) return t[q].dat;
return ask(lc,l,r)+ask(rc,l,r);
}
signed main(){
freopen("1.in","r",stdin);
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
build(root[0],1,n);
for(int i=1;i<=m;i++){
int qwq=read(),opt=read(),x=read();
if(opt==1){
int y=read();
insert(root[i],root[qwq],1,n,x,y);
}
else{
cout<<ask(root[qwq],x,x)<<endl;
root[i]=root[qwq];
}
}
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...