只 Wa 了第二个点,萌新很疑惑
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
inline int read()
{
int num=0,w=1;char ch=getchar();
while(ch<'0'||'9'<ch) {if(ch=='-') w=-1;ch=getchar();}
while('0'<=ch&&ch<='9') {num*=10;num+=(ch-'0');ch=getchar();}
return num*w;
}
int n,m,top;
int rt,opt,loc,val;
int root[10000001];
int a[10000001];
struct node
{
int val;
int l;
int r;
}tree[10000001];
inline int add_new(int k)
{
tree[++top]=tree[k];
return top;
}
inline int build(int k,int l,int r)
{
k=++top;
if(l==r)
{
tree[k].val=a[l];
return top;
}
int mid=(l+r)>>1;
tree[k].l=build(tree[k].l,l,mid);
tree[k].r=build(tree[k].r,mid+1,r);
return k;
}
inline int change(int k,int l,int r,int x,int v)
{
k=add_new(k);
if(l==r)
{
tree[k].val=v;
return k;
}
int mid=(l+r)>>1;
if(x<=mid)tree[k].l=change(tree[k].l,l,mid,x,v);
else tree[k].r=change(tree[k].r,mid+1,r,x,v);
return k;
}
inline int find(int k,int l,int r,int x)
{
if(l==r) return tree[k].val;
int mid=(l+r)>>1;
if(x<=mid) return find(tree[k].l,l,mid,x);
else return find(tree[k].r,mid+1,r,x);
}
int main()
{
#ifdef FIO
freopen("D:/Code/In.in","r",stdin);
freopen("D:/Code/Out.out","w",stdout);
#else
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
root[0]=build(0,1,n);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&rt,&opt,&loc);
if(opt==1)
{
scanf("%d",&val);
root[i]=change(root[rt],1,n,loc,val);
}
if(opt==2)
{
printf("%d\n",find(root[rt],1,n,loc));
root[i]=root[rt];
}
}
return 0;
}