#include <bits/stdc++.h>
#define eprintf(args...) fprintf(stderr, args)
#define rep(i, n) for (int i = 0; i < (int)(n); ++ i)
using i64 = long long;
const int mxn = 2e5 + 5, mxlg = 20;
int n, q, ini[mxn];
std::vector <int> oadj[mxn];
int odfn[mxn], oed[mxn], otim;
std::vector <std::pair <int, std::pair <int, int> > > edges;
void dfs2(int u, int p) {
odfn[u] = ++ otim;
for (int v : oadj[u]) {
if (v == p) continue;
dfs2(v, u);
}
oed[u] = otim;
}
struct UnionFind {
int fa[mxn];
void init() { rep(i, mxn) fa[i] = i; }
inline int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
inline void merge(int x, int y) { fa[find(x)] = find(y); }
} uf;
int fa[mxn], jmp[mxn][mxlg], jmp_min[mxn][mxlg];
std::vector <int> adj[mxn];
int wei[mxn];
int root;
int dep[mxn], sz[mxn], son[mxn], top[mxn], dfn[mxn], ed[mxn], tim;
struct Query {
int tp, id;
int x, y, v;
int pos;
};
bool operator < (const Query &a, const Query &b) {
return a.x != b.x ? a.x < b.x : a.tp > b.tp;
}
bool is_qry[mxn];
std::vector <Query> vqry;
void dfs0(int u) {
sz[u] = 1;
son[u] = -1;
for (int v : adj[u]) {
dep[v] = dep[u] + 1;
dfs0(v);
sz[u] += sz[v];
son[u] = !~son[u] || sz[v] > sz[son[u]] ? v : son[u];
}
}
void dfs1(int u) {
top[u] = u == root || u != son[fa[u]] ? u : top[fa[u]];
dfn[u] = ++ tim;
if (~son[u]) dfs1(son[u]);
for (int v : adj[u]) if (v != son[u]) dfs1(v);
ed[u] = tim;
}
struct BIT {
i64 s[mxn];
void update(int x, i64 v) { for (; x < mxn; x += x & -x) s[x] += v; }
i64 query(int x) { i64 ans = 0; for (; x; x -= x & -x) ans += s[x]; return ans; }
} bit;
i64 ans[mxn];
void conq(int l, int r) {
if (l + 1 >= r) return ;
int mid = (l + r) >> 1;
conq(l, mid);
conq(mid, r);
std::inplace_merge(vqry.begin() + l, vqry.begin() + mid, vqry.begin() + r);
for (int i = l; i < r; ++ i) {
Query Q = vqry[i];
if (Q.tp == 1 && Q.pos < mid) bit.update(Q.y, Q.v);
if (Q.tp == 0 && Q.pos >= mid) ans[Q.id] += bit.query(Q.y) * Q.v;
}
for (int i = l; i < r; ++ i) {
Query Q = vqry[i];
if (Q.tp == 1 && Q.pos < mid) bit.update(Q.y, -Q.v);
}
}
int main() {
// freopen("in", "r", stdin);
scanf("%d %d", &n, &q);
rep(i, n) scanf("%d", &ini[i]);
rep(i, n - 1) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
-- u, -- v;
edges.push_back({w, {u, v}});
oadj[u].push_back(v);
oadj[v].push_back(u);
}
dfs2(0, -1);
std::sort(edges.rbegin(), edges.rend());
uf.init();
rep(i, n) wei[i] = 0x3f3f3f3f;
for (auto tr : edges) {
int w = tr.first;
int u = tr.second.first;
int v = tr.second.second;
u = uf.find(u), v = uf.find(v);
int x = n ++;
wei[x] = w;
adj[x].push_back(u);
adj[x].push_back(v);
fa[u] = fa[v] = x;
uf.merge(u, x);
uf.merge(v, x);
}
root = n - 1;
fa[root] = root;
rep(i, n) jmp[i][0] = fa[i], jmp_min[i][0] = std::min(wei[i], wei[fa[i]]);
rep(j, mxlg - 1) rep(i, n) jmp[i][j + 1] = jmp[jmp[i][j]][j], jmp_min[i][j + 1] = std::min(jmp_min[i][j], jmp_min[jmp[i][j]][j]);
dfs0(root);
dfs1(root);
for(int i = 0; i < n; i++){
std::cout << i << ' ' << odfn[i] << ' ' << oed[i] << ' ' << dfn[i] << ' ' << ed[i] << '\n';
}
rep(tc, q) {
int tp; scanf("%d", &tp);
if (tp == 1) {
is_qry[tc] = true;
int u;
scanf("%d", &u);
-- u;
ans[tc] += ini[u];
vqry.push_back({0, tc, dfn[u], odfn[u], +1});
} else {
int x, y, u;
scanf("%d %d %d", &x, &y, &u);
-- u;
int ou = u;
for (int i = mxlg - 1; ~i; -- i) {
if (jmp_min[u][i] >= y) {
u = jmp[u][i];
}
}
std::cout << ou << ' ' << u << '\n';
vqry.push_back({1, tc, dfn[u], odfn[ou], +x});
vqry.push_back({1, tc, dfn[u], oed[ou] + 1, -x});
vqry.push_back({1, tc, ed[u] + 1, odfn[ou], -x});
vqry.push_back({1, tc, ed[u] + 1, oed[ou] + 1, +x});
}
}
rep(i, vqry.size()) vqry[i].pos = i;
conq(0, (int) vqry.size());
rep(i, q) if (is_qry[i]) printf("%lld\n", ans[i]);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGVwcmludGYoYXJncy4uLikgZnByaW50ZihzdGRlcnIsIGFyZ3MpCiNkZWZpbmUgcmVwKGksIG4pIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkobik7ICsrIGkpCgp1c2luZyBpNjQgPSBsb25nIGxvbmc7Cgpjb25zdCBpbnQgbXhuID0gMmU1ICsgNSwgbXhsZyA9IDIwOwoKaW50IG4sIHEsIGluaVtteG5dOwpzdGQ6OnZlY3RvciA8aW50PiBvYWRqW214bl07CmludCBvZGZuW214bl0sIG9lZFtteG5dLCBvdGltOwpzdGQ6OnZlY3RvciA8c3RkOjpwYWlyIDxpbnQsIHN0ZDo6cGFpciA8aW50LCBpbnQ+ID4gPiBlZGdlczsKCnZvaWQgZGZzMihpbnQgdSwgaW50IHApIHsKICAgIG9kZm5bdV0gPSArKyBvdGltOwogICAgZm9yIChpbnQgdiA6IG9hZGpbdV0pIHsKICAgICAgICBpZiAodiA9PSBwKSBjb250aW51ZTsKICAgICAgICBkZnMyKHYsIHUpOwogICAgfQogICAgb2VkW3VdID0gb3RpbTsKfQoKc3RydWN0IFVuaW9uRmluZCB7CiAgICBpbnQgZmFbbXhuXTsKICAgIHZvaWQgaW5pdCgpIHsgcmVwKGksIG14bikgZmFbaV0gPSBpOyB9CiAgICBpbmxpbmUgaW50IGZpbmQoaW50IHgpIHsgcmV0dXJuIHggPT0gZmFbeF0gPyB4IDogZmFbeF0gPSBmaW5kKGZhW3hdKTsgfQogICAgaW5saW5lIHZvaWQgbWVyZ2UoaW50IHgsIGludCB5KSB7IGZhW2ZpbmQoeCldID0gZmluZCh5KTsgfQp9IHVmOwoKaW50IGZhW214bl0sIGptcFtteG5dW214bGddLCBqbXBfbWluW214bl1bbXhsZ107CnN0ZDo6dmVjdG9yIDxpbnQ+IGFkaltteG5dOwppbnQgd2VpW214bl07CmludCByb290OwoKaW50IGRlcFtteG5dLCBzeltteG5dLCBzb25bbXhuXSwgdG9wW214bl0sIGRmbltteG5dLCBlZFtteG5dLCB0aW07CgpzdHJ1Y3QgUXVlcnkgewogICAgaW50IHRwLCBpZDsKICAgIGludCB4LCB5LCB2OwogICAgaW50IHBvczsKfTsKCmJvb2wgb3BlcmF0b3IgPCAoY29uc3QgUXVlcnkgJmEsIGNvbnN0IFF1ZXJ5ICZiKSB7CiAgICByZXR1cm4gYS54ICE9IGIueCA/IGEueCA8IGIueCA6IGEudHAgPiBiLnRwOwp9Cgpib29sIGlzX3FyeVtteG5dOwpzdGQ6OnZlY3RvciA8UXVlcnk+IHZxcnk7Cgp2b2lkIGRmczAoaW50IHUpIHsKICAgIHN6W3VdID0gMTsKICAgIHNvblt1XSA9IC0xOwogICAgZm9yIChpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGRlcFt2XSA9IGRlcFt1XSArIDE7CiAgICAgICAgZGZzMCh2KTsKICAgICAgICBzelt1XSArPSBzelt2XTsKICAgICAgICBzb25bdV0gPSAhfnNvblt1XSB8fCBzelt2XSA+IHN6W3Nvblt1XV0gPyB2IDogc29uW3VdOwogICAgfQp9Cgp2b2lkIGRmczEoaW50IHUpIHsKICAgIHRvcFt1XSA9IHUgPT0gcm9vdCB8fCB1ICE9IHNvbltmYVt1XV0gPyB1IDogdG9wW2ZhW3VdXTsKICAgIGRmblt1XSA9ICsrIHRpbTsKICAgIGlmICh+c29uW3VdKSBkZnMxKHNvblt1XSk7CiAgICBmb3IgKGludCB2IDogYWRqW3VdKSBpZiAodiAhPSBzb25bdV0pIGRmczEodik7CiAgICBlZFt1XSA9IHRpbTsKfQoKc3RydWN0IEJJVCB7CiAgICBpNjQgc1tteG5dOwogICAgdm9pZCB1cGRhdGUoaW50IHgsIGk2NCB2KSB7IGZvciAoOyB4IDwgbXhuOyB4ICs9IHggJiAteCkgc1t4XSArPSB2OyB9CiAgICBpNjQgcXVlcnkoaW50IHgpIHsgaTY0IGFucyA9IDA7IGZvciAoOyB4OyB4IC09IHggJiAteCkgYW5zICs9IHNbeF07IHJldHVybiBhbnM7IH0KfSBiaXQ7CgppNjQgYW5zW214bl07Cgp2b2lkIGNvbnEoaW50IGwsIGludCByKSB7CiAgICBpZiAobCArIDEgPj0gcikgcmV0dXJuIDsKICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICBjb25xKGwsIG1pZCk7CiAgICBjb25xKG1pZCwgcik7CiAgICBzdGQ6OmlucGxhY2VfbWVyZ2UodnFyeS5iZWdpbigpICsgbCwgdnFyeS5iZWdpbigpICsgbWlkLCB2cXJ5LmJlZ2luKCkgKyByKTsKICAgIGZvciAoaW50IGkgPSBsOyBpIDwgcjsgKysgaSkgewogICAgICAgIFF1ZXJ5IFEgPSB2cXJ5W2ldOwogICAgICAgIGlmIChRLnRwID09IDEgJiYgUS5wb3MgPCBtaWQpIGJpdC51cGRhdGUoUS55LCBRLnYpOwogICAgICAgIGlmIChRLnRwID09IDAgJiYgUS5wb3MgPj0gbWlkKSBhbnNbUS5pZF0gKz0gYml0LnF1ZXJ5KFEueSkgKiBRLnY7CiAgICB9CiAgICBmb3IgKGludCBpID0gbDsgaSA8IHI7ICsrIGkpIHsKICAgICAgICBRdWVyeSBRID0gdnFyeVtpXTsKICAgICAgICBpZiAoUS50cCA9PSAxICYmIFEucG9zIDwgbWlkKSBiaXQudXBkYXRlKFEueSwgLVEudik7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgLy8gZnJlb3BlbigiaW4iLCAiciIsIHN0ZGluKTsKICAgIHNjYW5mKCIlZCAlZCIsICZuLCAmcSk7CiAgICByZXAoaSwgbikgc2NhbmYoIiVkIiwgJmluaVtpXSk7CiAgICByZXAoaSwgbiAtIDEpIHsKICAgICAgICBpbnQgdSwgdiwgdzsKICAgICAgICBzY2FuZigiJWQgJWQgJWQiLCAmdSwgJnYsICZ3KTsKICAgICAgICAtLSB1LCAtLSB2OwogICAgICAgIGVkZ2VzLnB1c2hfYmFjayh7dywge3UsIHZ9fSk7CiAgICAgICAgb2Fkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgb2Fkalt2XS5wdXNoX2JhY2sodSk7CiAgICB9CiAgICBkZnMyKDAsIC0xKTsKICAgIHN0ZDo6c29ydChlZGdlcy5yYmVnaW4oKSwgZWRnZXMucmVuZCgpKTsKICAgIHVmLmluaXQoKTsKICAgIHJlcChpLCBuKSB3ZWlbaV0gPSAweDNmM2YzZjNmOwogICAgZm9yIChhdXRvIHRyIDogZWRnZXMpIHsKICAgICAgICBpbnQgdyA9IHRyLmZpcnN0OwogICAgICAgIGludCB1ID0gdHIuc2Vjb25kLmZpcnN0OwogICAgICAgIGludCB2ID0gdHIuc2Vjb25kLnNlY29uZDsKICAgICAgICB1ID0gdWYuZmluZCh1KSwgdiA9IHVmLmZpbmQodik7CiAgICAgICAgaW50IHggPSBuICsrOwogICAgICAgIHdlaVt4XSA9IHc7CiAgICAgICAgYWRqW3hdLnB1c2hfYmFjayh1KTsKICAgICAgICBhZGpbeF0ucHVzaF9iYWNrKHYpOwogICAgICAgIGZhW3VdID0gZmFbdl0gPSB4OwogICAgICAgIHVmLm1lcmdlKHUsIHgpOwogICAgICAgIHVmLm1lcmdlKHYsIHgpOwogICAgfQogICAgcm9vdCA9IG4gLSAxOwogICAgZmFbcm9vdF0gPSByb290OwogICAgcmVwKGksIG4pIGptcFtpXVswXSA9IGZhW2ldLCBqbXBfbWluW2ldWzBdID0gc3RkOjptaW4od2VpW2ldLCB3ZWlbZmFbaV1dKTsKICAgIHJlcChqLCBteGxnIC0gMSkgcmVwKGksIG4pIGptcFtpXVtqICsgMV0gPSBqbXBbam1wW2ldW2pdXVtqXSwgam1wX21pbltpXVtqICsgMV0gPSBzdGQ6Om1pbihqbXBfbWluW2ldW2pdLCBqbXBfbWluW2ptcFtpXVtqXV1bal0pOwogICAgZGZzMChyb290KTsKICAgIGRmczEocm9vdCk7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgIAlzdGQ6OmNvdXQgPDwgaSA8PCAnICcgPDwgb2RmbltpXSA8PCAnICcgPDwgb2VkW2ldIDw8ICcgJyA8PCBkZm5baV0gPDwgJyAnIDw8IGVkW2ldIDw8ICdcbic7CiAgICB9CiAgICByZXAodGMsIHEpIHsKICAgICAgICBpbnQgdHA7IHNjYW5mKCIlZCIsICZ0cCk7CiAgICAgICAgaWYgKHRwID09IDEpIHsKICAgICAgICAgICAgaXNfcXJ5W3RjXSA9IHRydWU7CiAgICAgICAgICAgIGludCB1OwogICAgICAgICAgICBzY2FuZigiJWQiLCAmdSk7CiAgICAgICAgICAgIC0tIHU7CiAgICAgICAgICAgIGFuc1t0Y10gKz0gaW5pW3VdOwogICAgICAgICAgICB2cXJ5LnB1c2hfYmFjayh7MCwgdGMsIGRmblt1XSwgb2Rmblt1XSwgKzF9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgeCwgeSwgdTsKICAgICAgICAgICAgc2NhbmYoIiVkICVkICVkIiwgJngsICZ5LCAmdSk7CiAgICAgICAgICAgIC0tIHU7CiAgICAgICAgICAgIGludCBvdSA9IHU7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSBteGxnIC0gMTsgfmk7IC0tIGkpIHsKICAgICAgICAgICAgICAgIGlmIChqbXBfbWluW3VdW2ldID49IHkpIHsKICAgICAgICAgICAgICAgICAgICB1ID0gam1wW3VdW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBvdSA8PCAnICcgPDwgdSA8PCAnXG4nOwogICAgICAgICAgICB2cXJ5LnB1c2hfYmFjayh7MSwgdGMsIGRmblt1XSwgb2RmbltvdV0sICt4fSk7CiAgICAgICAgICAgIHZxcnkucHVzaF9iYWNrKHsxLCB0YywgZGZuW3VdLCBvZWRbb3VdICsgMSwgLXh9KTsKICAgICAgICAgICAgdnFyeS5wdXNoX2JhY2soezEsIHRjLCBlZFt1XSArIDEsIG9kZm5bb3VdLCAteH0pOwogICAgICAgICAgICB2cXJ5LnB1c2hfYmFjayh7MSwgdGMsIGVkW3VdICsgMSwgb2VkW291XSArIDEsICt4fSk7CiAgICAgICAgfQogICAgfQogICAgcmVwKGksIHZxcnkuc2l6ZSgpKSB2cXJ5W2ldLnBvcyA9IGk7CiAgICBjb25xKDAsIChpbnQpIHZxcnkuc2l6ZSgpKTsKICAgIHJlcChpLCBxKSBpZiAoaXNfcXJ5W2ldKSBwcmludGYoIiVsbGRcbiIsIGFuc1tpXSk7CiAgICByZXR1cm4gMDsKfQo=