RT,64pts,sub#0全WA,sub#4全RE
另,请忽略记录代码里中二的图书馆注释(捂脸),谢谢
#include<bits/stdc++.h>
#define ll long long
#define R read()
using namespace std;
inline ll read() {
ll s=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f*=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
s=s*10+ch-'0';
ch=getchar();
}
return s*f;
}
inline void write(ll x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10),x%=10;
putchar('0'+x);
}//Don't use it for CF.
inline void wk(ll x){write(x);putchar(' ');}
inline void we(ll x){write(x);putchar('\n');}
ll n,m,top;
ll a[2500005],root[2500005];
struct Tree{ll ls,rs,val;}tree[2500005];
ll Add(ll x){tree[++top]=tree[x];return top;}
ll init(ll x,ll l,ll r){
x=++top;
if(l==r){
tree[x].val=a[l];
return top;
}
ll mid=(l+r)>>1;
tree[x].ls=init(tree[x].ls,l,mid);
tree[x].rs=init(tree[x].rs,mid+1,r);
return x;
}
ll upd(ll x,ll l,ll r,ll target,ll v){
x=Add(x);
if(l==r)tree[x].val=v;
else{
ll mid=(l+r)>>1;
if(target<=mid)tree[x].ls=upd(tree[x].ls,l,mid,target,v);
else tree[x].rs=upd(tree[x].rs,mid+1,r,target,v);
}
return x;
}
ll query(ll x,ll l,ll r,ll target){
if(l==r)return tree[x].val;
ll mid=(l+r)>>1;
if(target<=mid)return query(tree[x].ls,l,mid,target);
return query(tree[x].rs,mid+1,r,target);
}
int main(){
n=R,m=R;
for(ll i=1;i<=n;i++)a[i]=R;
fflush(stdout);
root[0]=init(0,1,n);
for(ll i=1;i<=m;i++){
ll ver=R,mo=R,x=R;
if(mo==1){
ll y=R;
root[i]=upd(root[ver],1,n,x,y);
}
else {
we(query(root[ver],1,n,x));
root[i]=root[ver];
}
fflush(stdout);
}
return 0;
}