其实就是可持久化线段树的模板题
线段树不会看这里
#include<bits/stdc++.h> const int N=1000005; using namespace std; int a[N],n,m,q,rt[N*20]; int lc[N*20],rc[N*20],val[N*20],cnt; int rd(){ register int f=1,x=0;register char ch; do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0' or ch>'9'); do{x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}while(ch>='0' and ch<='9'); return f*x; } void build(int &o,int l,int r){ o=++cnt; if(l==r){ val[o]=a[l]; return; } int mid=(l+r)>>1; build(lc[o],l,mid);build(rc[o],mid+1,r); } void insert(int &o,int pre,int l,int r,int q,int v){ o=++cnt;lc[o]=lc[pre];rc[o]=rc[pre];val[o]=val[pre]; if(l==r){ val[o]=v; return; } int mid=(l+r)>>1; if(q<=mid)insert(lc[o],lc[pre],l,mid,q,v); else insert(rc[o],rc[pre],mid+1,r,q,v); } int query(int o,int l,int r,int q){ if(l==r)return val[o]; int mid=(l+r)>>1; if(q<=mid) return query(lc[o],l,mid,q); else return query(rc[o],mid+1,r,q); } int main(){ n=rd();m=rd(); for(int i=1;i<=n;i++) a[i]=rd(); build(rt[0],1,n); for(int i=1;i<=m;i++){ int pre=rd(),opt=rd(),x=rd(); if(opt==1){ int v=rd(); insert(rt[i],rt[pre],1,n,x,v); }else{ printf("%d ",query(rt[pre],1,n,x)); rt[i]=rt[pre]; } } }