8pts求调

P3919 【模板】可持久化线段树 1(可持久化数组)

改了几个一眼错,40 了 ```cpp #include<bits/stdc++.h> using namespace std; struct edge{ int l,r,val; }y[53000000]; int root[1000005]; int x[1000005]; int top=0; void build(int now,int l,int r){ if(l==r){ y[now].val=x[l]; return; } int mid=(l+r)/2; top++; y[now].l=top; build(top,l,mid); top++; y[now].r=top; build(top,mid+1,r); return; } void up(int now,int had,int l,int r,int a,int p){ if(l==r&&l==a){ y[now].val=p; return; } int mid=(l+r)/2; if(a<=mid){ top++; y[now].l=top; y[now].r=y[had].r; up(top,y[had].l,l,mid,a,p); } else{ top++; y[now].l=y[had].l; y[now].r=top; up(top,y[had].r,mid+1,r,a,p); } //cout<<y[now].l<<' '<<y[now].r<<endl; return; } int down(int now,int l,int r,int a){ //cout<<l<<' '<<r<<' '<<a<<endl; if(l==r&&l==a)return y[now].val; int mid=(l+r)/2; if(a<=mid)return down(y[now].l,l,mid,a); else return down(y[now].r,mid+1,r,a); } int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&x[i]); build(0,1,n); for(int i=1;i<=m;i++){ int kind,num,got; scanf("%d%d%d",&num,&kind,&got); if(kind==1){ int go; scanf("%d",&go); top++; root[i]=top; //cout<<top<<' '<<now<<endl; up(top,root[num],1,n,got,go); } else{ root[i]=root[i-1]; printf("%d\n",down(root[num],1,n,got)); } } return 0; } ```
by Iniaugoty @ 2024-04-07 22:42:12


@[Iniaugoty](/user/768612) 我擦怎么是你啊
by 20220621Soren @ 2024-04-08 19:57:59


@[Iniaugoty](/user/768612) 你自己造了一个一眼错 ```cpp root[i]=root[i-1]; ``` 应该是 ```cpp root[i]=root[num]; ``` (我们老师改的)
by 20220621Soren @ 2024-04-09 09:27:26


改完就对了,此贴结(拜谢 @[Iniaugoty](/user/768612) 和教练 @ SKT_Crush)
by 20220621Soren @ 2024-04-09 09:29:08


|