传送门
【题目分析】
板子题不想写题解(我已经被SDOI染色恶心死了)。。。直接看代码即可。
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e7+10;
int n,q;
int root[MAXN>>1],lc[MAXN],rc[MAXN],val[MAXN];
int cnt;
int Read(){
int i=0,f=1;
char c;
for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-')
f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
void build(int &rt,int l,int r){
rt=++cnt;
if (l==r){
val[rt]=Read();
return;
}
int mid=l+r>>1;
build(lc[rt],l,mid);
build(rc[rt],mid+1,r);
}
void update(int &rt,int x,int l,int r,int pos,int key){
rt=++cnt;
lc[cnt]=lc[x];rc[cnt]=rc[x];
if (l==r){
val[rt]=key;
return;
}
int mid=l+r>>1;
if(pos<=mid)
update(lc[rt],lc[x],l,mid,pos,key);
else
update(rc[rt],rc[x],mid+1,r,pos,key);
}
void query(int rt,int l,int r,int x){
if (l==r){
cout<<val[rt]<<'\n';
return;
}
int mid=l+r>>1;
if(x<=mid)
query(lc[rt],l,mid,x);
else
query(rc[rt],mid+1,r,x);
}
int main(){
n=Read(),q=Read();
build(root[0],1,n);
for(int i=1;i<=q;i++){
int tim=Read(),cz=Read();
if(cz==1){
int x=Read(),y=Read();;
update(root[i],root[tim],1,n,x,y);
}
else{
int x=Read();
query(root[tim],1,n,x);
root[i]=root[tim];
}
}
return 0;
}