代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
const int M = N * 20;
int n, m;
int a[N];
int tot; //节点个数
int len, root[M]; //所有版本的根节点
struct segment_tree{
int lt, rt; //代表区间
int l, r; //左右孩子
int v; //代表值
}tree[M];
void pushup(int node){
tree[node].v = tree[tree[node].l].v + tree[tree[node].r].v;
}
void build(int node, int lt, int rt){
if(lt == rt){
tree[node].lt = lt, tree[node].rt = rt;
tree[node].v = a[lt];
return ;
}
int mid = lt + rt >> 1;
tot = max(tot, node << 1 | 1);
tree[node].l = node << 1, tree[node].r = node << 1 | 1;
build(node << 1, lt, mid);
build(node << 1 | 1, mid + 1, rt);
pushup(node);
}
void update(int node, int x, int k){
if(tree[node].lt == tree[node].rt){
tot++;
tree[tot].lt = tree[node].lt, tree[tot].rt = tree[node].rt;
tree[tot].v = tree[node].v + k;
return ;
}
tot++;
tree[tot].lt = tree[node].lt, tree[tot].rt = tree[node].rt;
tree[tot].v = tree[node].v + k;
int mid = tree[node].lt + tree[node].rt >> 1;
if(tree[node].lt <= x && x <= mid){
tree[tot].l = tot + 1, tree[tot].r = tree[node].r;
update(tree[node].l, x, k);
}
else{
tree[tot].l = tree[node].l, tree[tot].r = tot + 1;
update(tree[node].r, x, k);
}
}
int query(int node, int x){
if(tree[node].lt == tree[node].rt){
return tree[node].v;
}
int mid = tree[node].lt + tree[node].rt >> 1, ans = 0;
if(tree[node].lt <= x && x <= mid){
ans = query(tree[node].l, x);
}
else{
ans = query(tree[node].r, x);
}
return ans;
}
void Solve(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
root[++len] = 1;
build(1, 1, n);
while(m--){
int v, op;
cin >> v >> op;
v++;
if(op == 1){
int x, k;
cin >> x >> k;
root[++len] = tot + 1;
update(root[v], x, k);
}
else{
int x;
cin >> x;
len++;
root[len] = root[len - 1];
cout << query(root[v], x) << '\n';
}
}
}
signed main(){
Solve();
return 0;
}