#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 10;
struct Node {
long long add, sum;
};
vector<int> G[N];
int a[N], dep[N], fa[N], hson[N], sz[N], top[N], dfn[N], seq[N];
Node sgt[N*4];
int n, m, t;
void dfs1(int u, int p) {
sz[u] = 1;
for (int v: G[u]) {
if (v == p) continue;
dep[v] = dep[u] + 1;
fa[v] = u;
dfs1(v, u);
sz[u] += sz[v];
if (!hson[u] || sz[v] > sz[hson[u]]) hson[u] = v;
}
}
void dfs2(int u, int p) {
dfn[u] = ++ t;
seq[t] = a[u];
if (!hson[u]) return;
top[hson[u]] = top[u];
dfs2(hson[u], u);
for (int v: G[u]) {
if (v == p || v == hson[u]) continue;
top[v] = v;
dfs2(v, u);
}
}
void push_down(int index, int begin, int end) {
if (sgt[index].add) {
int mid = (begin + end) / 2;
sgt[index*2].add += sgt[index].add;
sgt[index*2].sum += sgt[index].add * (mid - begin + 1);
sgt[index*2+1].add += sgt[index].add;
sgt[index*2+1].sum += sgt[index].add * (end - mid);
sgt[index].add = 0;
}
}
void push_up(int index) {
sgt[index].sum = sgt[index*2].sum + sgt[index*2+1].sum;
}
void build(int index, int begin, int end) {
if (begin >= end) {
sgt[index].sum = seq[begin];
return;
}
int mid = (begin + end) / 2;
build(index * 2, begin, mid);
build(index * 2 + 1, mid + 1, end);
push_up(index);
}
void update(int index, int begin, int end, int left, int right, int val) {
if (left <= begin && right >= end) {
sgt[index].add += val;
sgt[index].sum += 1LL * (end - begin + 1) * val;
return;
}
push_down(index, begin, end);
int mid = (begin + end) / 2;
if (right <= mid) update(index * 2, begin, mid, left, right, val);
else if (left > mid) update(index * 2 + 1, mid + 1, end, left, right, val);
else {
update(index * 2, begin, mid, left, mid, val);
update(index * 2 + 1, mid + 1, end, mid + 1, right, val);
}
push_up(index);
}
long long query(int index, int begin, int end, int left, int right) {
if (left <= begin && right >= end) return sgt[index].sum;
push_down(index, begin, end);
int mid = (begin + end) / 2;
if (right <= mid) return query(index * 2, begin, mid, left, right);
else if (left > mid) return query(index * 2 + 1, mid + 1, end, left, right);
else return query(index * 2, begin, mid, left, mid) + query(index * 2 + 1, mid + 1, end, mid + 1, right);
}
long long query(int u) {
long long res = query(1, 1, n, dfn[top[u]], dfn[u]);
if (top[u] != 1) res += query(fa[top[u]]);
return res;
}
int main() {
int u, v, op, x, w;
scanf("%d %d", &n, &m);
for (int i=1; i<=n; i++) scanf("%d", &a[i]);
for (int i=0; i<n-1; i++) {
scanf("%d %d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs1(1, -1);
top[1] = fa[1] = 1;
dfs2(1, -1);
build(1, 1, n);
while (m --) {
scanf("%d", &op);
if (op == 1) {
scanf("%d %d", &x, &w);
update(1, 1, n, dfn[x], dfn[x], w);
}
else if (op == 2) {
scanf("%d %d", &x, &w);
update(1, 1, n, dfn[x], dfn[x] + sz[x] - 1, w);
}
else {
scanf("%d", &x);
printf("%lld\n", query(x));
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE4gPSAxMDAwMDAgKyAxMDsKCnN0cnVjdCBOb2RlIHsKCWxvbmcgbG9uZyBhZGQsIHN1bTsKfTsKCnZlY3RvcjxpbnQ+IEdbTl07CmludCBhW05dLCBkZXBbTl0sIGZhW05dLCBoc29uW05dLCBzeltOXSwgdG9wW05dLCBkZm5bTl0sIHNlcVtOXTsKTm9kZSBzZ3RbTio0XTsKaW50IG4sIG0sIHQ7Cgp2b2lkIGRmczEoaW50IHUsIGludCBwKSB7Cglzelt1XSA9IDE7Cglmb3IgKGludCB2OiBHW3VdKSB7CgkJaWYgKHYgPT0gcCkgY29udGludWU7CgkJZGVwW3ZdID0gZGVwW3VdICsgMTsKCQlmYVt2XSA9IHU7CgkJZGZzMSh2LCB1KTsKCQlzelt1XSArPSBzelt2XTsKCQlpZiAoIWhzb25bdV0gfHwgc3pbdl0gPiBzeltoc29uW3VdXSkgaHNvblt1XSA9IHY7Cgl9Cn0KCnZvaWQgZGZzMihpbnQgdSwgaW50IHApIHsKCWRmblt1XSA9ICsrIHQ7CglzZXFbdF0gPSBhW3VdOwoJaWYgKCFoc29uW3VdKSByZXR1cm47Cgl0b3BbaHNvblt1XV0gPSB0b3BbdV07CglkZnMyKGhzb25bdV0sIHUpOwoJZm9yIChpbnQgdjogR1t1XSkgewoJCWlmICh2ID09IHAgfHwgdiA9PSBoc29uW3VdKSBjb250aW51ZTsKCQl0b3Bbdl0gPSB2OwoJCWRmczIodiwgdSk7Cgl9Cn0KCnZvaWQgcHVzaF9kb3duKGludCBpbmRleCwgaW50IGJlZ2luLCBpbnQgZW5kKSB7CglpZiAoc2d0W2luZGV4XS5hZGQpIHsKCQlpbnQgbWlkID0gKGJlZ2luICsgZW5kKSAvIDI7CgkJc2d0W2luZGV4KjJdLmFkZCArPSBzZ3RbaW5kZXhdLmFkZDsKCQlzZ3RbaW5kZXgqMl0uc3VtICs9IHNndFtpbmRleF0uYWRkICogKG1pZCAtIGJlZ2luICsgMSk7CgkJc2d0W2luZGV4KjIrMV0uYWRkICs9IHNndFtpbmRleF0uYWRkOwoJCXNndFtpbmRleCoyKzFdLnN1bSArPSBzZ3RbaW5kZXhdLmFkZCAqIChlbmQgLSBtaWQpOyAKCQlzZ3RbaW5kZXhdLmFkZCA9IDA7Cgl9Cn0KCnZvaWQgcHVzaF91cChpbnQgaW5kZXgpIHsKCXNndFtpbmRleF0uc3VtID0gc2d0W2luZGV4KjJdLnN1bSArIHNndFtpbmRleCoyKzFdLnN1bTsKfQoKdm9pZCBidWlsZChpbnQgaW5kZXgsIGludCBiZWdpbiwgaW50IGVuZCkgewoJaWYgKGJlZ2luID49IGVuZCkgewoJCXNndFtpbmRleF0uc3VtID0gc2VxW2JlZ2luXTsKCQlyZXR1cm47Cgl9CglpbnQgbWlkID0gKGJlZ2luICsgZW5kKSAvIDI7CglidWlsZChpbmRleCAqIDIsIGJlZ2luLCBtaWQpOwoJYnVpbGQoaW5kZXggKiAyICsgMSwgbWlkICsgMSwgZW5kKTsKCXB1c2hfdXAoaW5kZXgpOwp9Cgp2b2lkIHVwZGF0ZShpbnQgaW5kZXgsIGludCBiZWdpbiwgaW50IGVuZCwgaW50IGxlZnQsIGludCByaWdodCwgaW50IHZhbCkgewoJaWYgKGxlZnQgPD0gYmVnaW4gJiYgcmlnaHQgPj0gZW5kKSB7CgkJc2d0W2luZGV4XS5hZGQgKz0gdmFsOwoJCXNndFtpbmRleF0uc3VtICs9IDFMTCAqIChlbmQgLSBiZWdpbiArIDEpICogdmFsOwoJCXJldHVybjsKCX0KCXB1c2hfZG93bihpbmRleCwgYmVnaW4sIGVuZCk7CglpbnQgbWlkID0gKGJlZ2luICsgZW5kKSAvIDI7CglpZiAocmlnaHQgPD0gbWlkKSB1cGRhdGUoaW5kZXggKiAyLCBiZWdpbiwgbWlkLCBsZWZ0LCByaWdodCwgdmFsKTsKCWVsc2UgaWYgKGxlZnQgPiBtaWQpIHVwZGF0ZShpbmRleCAqIDIgKyAxLCBtaWQgKyAxLCBlbmQsIGxlZnQsIHJpZ2h0LCB2YWwpOwoJZWxzZSB7CgkJdXBkYXRlKGluZGV4ICogMiwgYmVnaW4sIG1pZCwgbGVmdCwgbWlkLCB2YWwpOwoJCXVwZGF0ZShpbmRleCAqIDIgKyAxLCBtaWQgKyAxLCBlbmQsIG1pZCArIDEsIHJpZ2h0LCB2YWwpOwoJfQoJcHVzaF91cChpbmRleCk7Cn0KCmxvbmcgbG9uZyBxdWVyeShpbnQgaW5kZXgsIGludCBiZWdpbiwgaW50IGVuZCwgaW50IGxlZnQsIGludCByaWdodCkgewoJaWYgKGxlZnQgPD0gYmVnaW4gJiYgcmlnaHQgPj0gZW5kKSByZXR1cm4gc2d0W2luZGV4XS5zdW07CglwdXNoX2Rvd24oaW5kZXgsIGJlZ2luLCBlbmQpOwoJaW50IG1pZCA9IChiZWdpbiArIGVuZCkgLyAyOwoJaWYgKHJpZ2h0IDw9IG1pZCkgcmV0dXJuIHF1ZXJ5KGluZGV4ICogMiwgYmVnaW4sIG1pZCwgbGVmdCwgcmlnaHQpOwoJZWxzZSBpZiAobGVmdCA+IG1pZCkgcmV0dXJuIHF1ZXJ5KGluZGV4ICogMiArIDEsIG1pZCArIDEsIGVuZCwgbGVmdCwgcmlnaHQpOwoJZWxzZSByZXR1cm4gcXVlcnkoaW5kZXggKiAyLCBiZWdpbiwgbWlkLCBsZWZ0LCBtaWQpICsgcXVlcnkoaW5kZXggKiAyICsgMSwgbWlkICsgMSwgZW5kLCBtaWQgKyAxLCByaWdodCk7Cn0KCmxvbmcgbG9uZyBxdWVyeShpbnQgdSkgewoJbG9uZyBsb25nIHJlcyA9IHF1ZXJ5KDEsIDEsIG4sIGRmblt0b3BbdV1dLCBkZm5bdV0pOwoJaWYgKHRvcFt1XSAhPSAxKSByZXMgKz0gcXVlcnkoZmFbdG9wW3VdXSk7CglyZXR1cm4gcmVzOwp9CgppbnQgbWFpbigpIHsKCWludCB1LCB2LCBvcCwgeCwgdzsKCXNjYW5mKCIlZCAlZCIsICZuLCAmbSk7Cglmb3IgKGludCBpPTE7IGk8PW47IGkrKykgc2NhbmYoIiVkIiwgJmFbaV0pOwoJZm9yIChpbnQgaT0wOyBpPG4tMTsgaSsrKSB7CgkJc2NhbmYoIiVkICVkIiwgJnUsICZ2KTsKCQlHW3VdLnB1c2hfYmFjayh2KTsKCQlHW3ZdLnB1c2hfYmFjayh1KTsKCX0KCWRmczEoMSwgLTEpOwoJdG9wWzFdID0gZmFbMV0gPSAxOwoJZGZzMigxLCAtMSk7CglidWlsZCgxLCAxLCBuKTsgCgl3aGlsZSAobSAtLSkgewoJCXNjYW5mKCIlZCIsICZvcCk7CgkJaWYgKG9wID09IDEpIHsKCQkJc2NhbmYoIiVkICVkIiwgJngsICZ3KTsKCQkJdXBkYXRlKDEsIDEsIG4sIGRmblt4XSwgZGZuW3hdLCB3KTsKCQl9CgkJZWxzZSBpZiAob3AgPT0gMikgewoJCQlzY2FuZigiJWQgJWQiLCAmeCwgJncpOwoJCQl1cGRhdGUoMSwgMSwgbiwgZGZuW3hdLCBkZm5beF0gKyBzelt4XSAtIDEsIHcpOwoJCX0KCQllbHNlIHsKCQkJc2NhbmYoIiVkIiwgJngpOwoJCQlwcmludGYoIiVsbGRcbiIsIHF1ZXJ5KHgpKTsKCQl9Cgl9CglyZXR1cm4gMDsKfQ==