WA的都是输出0的qwq
#include <iostream>
#include <cstdio>
typedef long long ll;
typedef double lf;
using namespace std;
const int INF = 1e9+7;
const int maxn = 1e6+5;
const int maxm = 1e6+5;
int n, m;
int a[maxn], rt[maxm];
int ver = -1;
template<typename type>
void inline read(type &x){
x = 0; type f = 1;
char ch = getchar();
while (ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
x = x*10+ch-'0', ch = getchar();
x = x*f;
}
struct node{
int l, r, sum;
int lson, rson;
}tree[maxn*40];
int cntnode = 0;
int clone(int id){
tree[++cntnode] = tree[id];
return cntnode;
}
void pushup(int id){
tree[id].sum = tree[tree[id].lson].sum + tree[tree[id].rson].sum;
}
void buildTree(int &id, int l, int r){
id = ++cntnode;
tree[id].l = l;
tree[id].r = r;
if (l == r){
tree[id].sum = a[l];
return;
}
int mid = (l+r)>>1;
buildTree(tree[id].lson, l, mid);
buildTree(tree[id].rson, mid+1, r);
pushup(id);
}
int change(int id, int x, int d){
int cloneid = clone(id);
int tl = tree[id].l;
int tr = tree[id].r;
if (tl == tr){
tree[cloneid].sum = d;
return cloneid;
}
int mid = (tl+tr)>>1;
if (x <= mid){
tree[cloneid].lson = change(tree[id].lson, x, d);
}else{
tree[cloneid].rson = change(tree[id].rson, x, d);
}
pushup(cloneid);
return cloneid;
}
int query(int id, int x){
int tl = tree[id].l;
int tr = tree[id].r;
if (tl == tr && tl == x){
return tree[id].sum;
}
int mid = (tl+tr)>>1;
if (x <= mid)
return query(tree[id].lson, x);
else if (x > mid)
return query(tree[id].rson, x);
}
int main(){
read(n); read(m);
for (int i = 1; i <= n; i++){
read(a[i]);
}
buildTree(rt[++ver], 1, n);
for (int i = 1; i <= m; i++){
int v, opt, loc, val;
read(v); read(opt);
if (opt == 1){
read(loc); read(val);
rt[++ver] = change(rt[v], loc, val);
}else if (opt == 2){
read(loc);
printf("%d\n", query(rt[v], loc));
rt[++ver] = change(rt[v], 1, 0);
}
}
return 0;
}