模板题,无题解。
Code:
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
template<typename T> void read(T &num){
char c=getchar();num=0;T f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
num*=f;
}
template<typename T> void qwq(T x){
if(x>9)qwq(x/10);
putchar(x%10+'0');
}
template<typename T> void write(T x){
if(x<0){x=-x;putchar('-');}
qwq(x);putchar('\n');
}
int co[1000010];int rt[1000010];int tot=0;
struct Persistent{
struct wzy{
int ls,rs,val;
}tree[20000010];
inline void build(int &pos,int l,int r){
pos=++tot;
if(l==r){tree[pos].val=co[l];return;}
int mid=(l+r)>>1;
build(tree[pos].ls,l,mid);build(tree[pos].rs,mid+1,r);
return;
}
inline void in(int u,int v,int l,int r,int k,int w){
rt[u]=++tot;int pos=tot;
while(l!=r){
int mid=(l+r)>>1;
if(k<=mid){
r=mid;
tree[pos].rs=tree[v].rs;tree[pos].ls=++tot;pos=tot;v=tree[v].ls;
}else{
l=mid+1;
tree[pos].ls=tree[v].ls;tree[pos].rs=++tot;pos=tot;v=tree[v].rs;
}
}
tree[pos].val=w;return;
}
inline int query(int u,int l,int r,int k){
int pos=rt[u];
while(l!=r){
int mid=(l+r)>>1;
if(k<=mid){pos=tree[pos].ls;r=mid;}
else{pos=tree[pos].rs;l=mid+1;}
}
return tree[pos].val;
}
inline void cop(int u,int v){
rt[u]=++tot;tree[tot].ls=tree[rt[v]].ls;tree[tot].rs=tree[rt[v]].rs;
return;
}
}ps;
int main(){
int n,m;read(n);read(m);
rep(i,1,n){read(co[i]);}
ps.build(rt[0],1,n);
rep(i,1,m){
int v,tmp,loc,w;read(v);read(tmp);read(loc);
if(tmp==1){
read(w);ps.in(i,rt[v],1,n,loc,w);
}else{
write(ps.query(v,1,n,loc));ps.cop(i,v);
}
}
return 0;
}