题目
传送门:QWQ
分析
主席树的模板,囤着
代码
#include <bits/stdc++.h> using namespace std; const int N=1000010; int ls[N*20], rs[N*20], root[N*20], newp, sum[N*20], a[N*20]; inline void insert(int l,int r,int x,int pos,int& cur,int cur1) { cur=++newp; ls[cur]=ls[cur1]; rs[cur]=rs[cur1]; sum[cur]=sum[cur1]; if(l==r) { sum[cur]=x; return; } int mid=l+r>>1; if(pos<=mid) insert(l,mid,x,pos,ls[cur],ls[cur1]); else insert(mid+1,r,x,pos,rs[cur],rs[cur1]); } inline void build(int l,int r,int& cur) { cur=++newp; if(l==r) { sum[cur]=a[l]; return; } int mid=l+r>>1; build(l,mid,ls[cur]); build(mid+1,r,rs[cur]); } inline int query(int l,int r,int pos,int cur) { if(l==r) return sum[cur]; int mid=l+r>>1; if(pos<=mid) return query(l,mid,pos,ls[cur]); else return query(mid+1,r,pos,rs[cur]); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,n,root[0]); int v1,opt,x,pos; for(int i=1;i<=m;i++) { scanf("%d%d",&v1,&opt); root[i]=root[v1]; if(opt==1){ scanf("%d%d",&pos,&x); insert(1,n,x,pos,root[i],root[i]); } else{ scanf("%d",&pos); printf("%d ",query(1,n,pos,root[v1])); } } return 0; }