1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <bits/stdc++.h>
using namespace std; #define LL long long #define ll long long #define ULL unsigned long long #define Pair pair<LL,LL> #define ls rt<<1 #define rs rt<<1|1 #define Pi acos(-1.0) #define eps 1e-6 #define DBINF 1e100 #define mod 998244353 #define MAXN 1e18 #define MS 1000009
int n,m; int a[MS]; struct node{ int l,r,val; }p[MS<<5]; int rtpos[MS]; int tot;
int build(int l,int r){ int rt = ++tot; if(l == r){ p[rt].val = a[l]; return rt; } int m = l+r>>1; p[rt].l = build(l,m); p[rt].r = build(m+1,r); return rt; }
int update(int pos,int l,int r,int lart,int val){ int rt = ++tot; p[rt] = p[lart]; if(l == r){ p[rt].val = val; return rt; } int m = l+r>>1; if(m >= pos) p[rt].l = update(pos,l,m,p[lart].l,val); else p[rt].r = update(pos,m+1,r,p[lart].r,val); return rt; }
int query(int pos,int l,int r,int rt){ if(l == r) return p[rt].val; int m = l+r>>1; if(m >= pos) return query(pos,l,m,p[rt].l); else return query(pos,m+1,r,p[rt].r); }
int main(){ ios::sync_with_stdio(false); cin >> n >> m; for(int i=1;i<=n;i++){ cin >> a[i]; } rtpos[0] = build(1,n); for(int i=1;i<=m;i++){ int vis,op,pos,val; cin >> vis >> op >> pos; if(op == 1){ cin >> val; rtpos[i] = update(pos,1,n,rtpos[vis],val); } else if(op == 2){ rtpos[i] = rtpos[vis]; cout << query(pos,1,n,rtpos[i]) << "\n"; } } return 0; }
|