#include <cstdio>
#include <cstring>
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <numeric>
#include <algorithm>
#include <functional>
#include <map>
#include <queue>
#include <vector>
#include <utility>
#define ed end()
#define bg begin()
#define mp make_pair
#define pb push_back
#define all(x) x.bg,x.ed
#define newline puts("")
#define si(x) ((int)x.size())
#define rep(i,n) for(int i = 1; i <= n; ++i)
#define rrep(i,n) for(int i = 0; i < n; ++i)
#define srep(i,s,t) for(int i = s; i <= t; ++i)
#define drep(i,s,t) for(int i = t; i >= s; --i)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const ll INF_ll = 1ll*INF*INF;
const int MOD = 1e9 + 7;
const double eps = 1e-7;
struct node{
int l, r, val;
} tr[MAX << 5];
int n, m;
int top;
int num[MAX];
int root[MAX];
inline int clone(int p){
top++;
tr[top] = tr[p];
return top;
}
int build(int p, int s, int e){
p = ++top;
if(s == e){
tr[p].val = num[s];
return top;
}
int mid = s + ((e - s) >> 1);
tr[p].l = build(tr[p].l, s, mid);
tr[p].r = build(tr[p].r, mid + 1, e);
return p;
}
int modify(int p, int s, int e, int pos, int nval){
p = clone(p);
if(s == e){
tr[p].val = nval;
return p;
}
int mid = s + ((e - s) >> 1);
if(pos <= mid)tr[p].l = modify(tr[p].l, s, mid, pos, nval);
else tr[p].r = modify(tr[p].r, mid + 1, e, pos, nval);
return p;
}
int query(int p, int s, int e, int pos){
if(s == e){
return tr[p].val;
}
int mid = s + ((e - s) >> 1);
if(pos <= mid) return query(tr[p].l, s, mid, pos);
else return query(tr[p].r, mid + 1, e, pos);
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m;
rep(i, n){
cin>>num[i];
}
root[0] = build(0, 1, n);
rep(i, m){
int ver, op, pos, value;
cin>>ver>>op>>pos;
if(op == 1){
cin>>value;
root[i] = modify(root[ver], 1, n, pos, value);
}
else{
cout<<query(root[ver], 1, n, pos)<<endl;
root[i] = root[ver];
}
}
return 0;
}
rt,看见提交记录里的聚聚都是1s到2s甚至有500ms多的,为什么我的就跑的这么慢呀。