#include<bits/stdc++.h>
using namespace std;
const int mx=2e5+5;
int n, q;
vector<int> adj[mx];
int in[mx], out[mx], timer;
long long bit[mx];
int val[mx]; // Lưu giá trị hiện tại của node để tính delta
// DFS duỗi cây
void dfs(int u, int p) {
in[u] = ++timer;
for(int v : adj[u]) {
if(v != p) dfs(v, u);
}
out[u] = timer;
}
// Fenwick Tree (BIT)
void update(int idx, int val) {
for(; idx <= n; idx += idx&-idx)
bit[idx] += val;
}
long long get(int idx) {
long long s = 0;
for(; idx > 0; idx -= idx&-idx)
s += bit[idx];
return s;
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
if(fopen("Subtree_Queries.inp","r"))
{
freopen("Subtree_Queries.inp","r",stdin);
freopen("Subtree_Queries.out","w",stdout);
}
cin >> n >> q;
for(int i=1; i<=n; ++i) cin >> val[i];
for(int i=1; i<n; ++i) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
// Bước 1: Duỗi cây
dfs(1, 0);
// Bước 2: Nạp giá trị ban đầu vào BIT theo thứ tự mới (in[i])
for(int i=1; i<=n; ++i) {
update(in[i], val[i]);
}
// Bước 3: Xử lý truy vấn
while(q--) {
int type;
cin >> type;
if(type == 1) {
int s, x;
cin >> s >> x;
// Update lượng chênh lệch
update(in[s], x - val[s]);
val[s] = x; // Cập nhật lại giá trị lưu trữ
} else {
int s;
cin >> s;
// Tổng đoạn [in[s]...out[s]]
cout << get(out[s]) - get(in[s]-1) << '\n';
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IG14PTJlNSs1OwppbnQgbiwgcTsKdmVjdG9yPGludD4gYWRqW214XTsKaW50IGluW214XSwgb3V0W214XSwgdGltZXI7CmxvbmcgbG9uZyBiaXRbbXhdOwppbnQgdmFsW214XTsgLy8gTMawdSBnacOhIHRy4buLIGhp4buHbiB04bqhaSBj4bunYSBub2RlIMSR4buDIHTDrW5oIGRlbHRhCgovLyBERlMgZHXhu5dpIGPDonkKdm9pZCBkZnMoaW50IHUsIGludCBwKSB7CiAgICBpblt1XSA9ICsrdGltZXI7CiAgICBmb3IoaW50IHYgOiBhZGpbdV0pIHsKICAgICAgICBpZih2ICE9IHApIGRmcyh2LCB1KTsKICAgIH0KICAgIG91dFt1XSA9IHRpbWVyOwp9CgovLyBGZW53aWNrIFRyZWUgKEJJVCkKdm9pZCB1cGRhdGUoaW50IGlkeCwgaW50IHZhbCkgewogICAgZm9yKDsgaWR4IDw9IG47IGlkeCArPSBpZHgmLWlkeCkKICAgICAgICBiaXRbaWR4XSArPSB2YWw7Cn0KCmxvbmcgbG9uZyBnZXQoaW50IGlkeCkgewogICAgbG9uZyBsb25nIHMgPSAwOwogICAgZm9yKDsgaWR4ID4gMDsgaWR4IC09IGlkeCYtaWR4KQogICAgICAgIHMgKz0gYml0W2lkeF07CiAgICByZXR1cm4gczsKfQoKaW50IG1haW4oKQp7CiAgICBjaW4udGllKDApLT5zeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBpZihmb3BlbigiU3VidHJlZV9RdWVyaWVzLmlucCIsInIiKSkKICAgIHsKICAgICAgICBmcmVvcGVuKCJTdWJ0cmVlX1F1ZXJpZXMuaW5wIiwiciIsc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIlN1YnRyZWVfUXVlcmllcy5vdXQiLCJ3IixzdGRvdXQpOwogICAgfQogICAgCiAgICBjaW4gPj4gbiA+PiBxOwogICAgZm9yKGludCBpPTE7IGk8PW47ICsraSkgY2luID4+IHZhbFtpXTsKICAgIAogICAgZm9yKGludCBpPTE7IGk8bjsgKytpKSB7CiAgICAgICAgaW50IHUsIHY7CiAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGFkalt2XS5wdXNoX2JhY2sodSk7CiAgICB9CiAgICAKICAgIC8vIELGsOG7m2MgMTogRHXhu5dpIGPDonkKICAgIGRmcygxLCAwKTsKICAgIAogICAgLy8gQsaw4bubYyAyOiBO4bqhcCBnacOhIHRy4buLIGJhbiDEkeG6p3UgdsOgbyBCSVQgdGhlbyB0aOG7qSB04buxIG3hu5tpIChpbltpXSkKICAgIGZvcihpbnQgaT0xOyBpPD1uOyArK2kpIHsKICAgICAgICB1cGRhdGUoaW5baV0sIHZhbFtpXSk7CiAgICB9CgogICAgLy8gQsaw4bubYyAzOiBY4butIGzDvSB0cnV5IHbhuqVuCiAgICB3aGlsZShxLS0pIHsKICAgICAgICBpbnQgdHlwZTsKICAgICAgICBjaW4gPj4gdHlwZTsKICAgICAgICBpZih0eXBlID09IDEpIHsKICAgICAgICAgICAgaW50IHMsIHg7CiAgICAgICAgICAgIGNpbiA+PiBzID4+IHg7CiAgICAgICAgICAgIC8vIFVwZGF0ZSBsxrDhu6NuZyBjaMOqbmggbOG7h2NoCiAgICAgICAgICAgIHVwZGF0ZShpbltzXSwgeCAtIHZhbFtzXSk7CiAgICAgICAgICAgIHZhbFtzXSA9IHg7IC8vIEPhuq1wIG5o4bqtdCBs4bqhaSBnacOhIHRy4buLIGzGsHUgdHLhu68KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgczsKICAgICAgICAgICAgY2luID4+IHM7CiAgICAgICAgICAgIC8vIFThu5VuZyDEkW/huqFuIFtpbltzXS4uLm91dFtzXV0KICAgICAgICAgICAgY291dCA8PCBnZXQob3V0W3NdKSAtIGdldChpbltzXS0xKSA8PCAnXG4nOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg==