// nxhhoang - the dreamer
// g++ -std=c++11 -Wall -Wextra -O2 B.cpp -o B.exe
// __builtin_popcount(x); - count bits 1
// __builtin_parity(x); nums of 1 (even or odd)
// __builtin_ctz(x); count trailing zeros
// __builtin_clz(x); count leading zeros
#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a), _b = (b); i < _b; i++)
#define endl '\n'
#define debug(x) cout << #x << " = " << x << '\n'
#define ub upper_bound // find target < min(value)
#define lb lower_bound // find target <= min(value)
#define fi first
#define se second
#define SIZE(x) (int)(x).size()
#define all(a) (a).begin(), (a).end()
#define pii pair<int, int>
#define pll pair<ll, ll>
#define vi vector<int>
#define vll vector<ll>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int MSIZE = 2e5 + 5;
const int MAXN = 4e7 + 5;
const int MOD = 1e9 + 7;
const int dx[] = {1, -1, 0, 0};
const int dy[] = {0, 0, 1, -1};
const int LOG = 19;
vector<vi> tre(MSIZE);
int euler[2 * MSIZE], in[MSIZE], out[MSIZE], height[MSIZE];
int timer = 1;
vector<vi> rmq(MSIZE, vi(20, 0));
struct SegmentTree {
vector<ll> val;
vector<int> cong;
vector<ll> lazy;
void build(int idx, int l, int r) {
if (l == r) {
if (euler[l] == -1) cong[idx]--;
else cong[idx]++;
return;
}
int mid = (l + r) >> 1;
build(2 * idx, l, mid);
build(2 * idx + 1, mid + 1, r);
cong[idx] = cong[idx * 2] + cong[idx * 2 + 1];
}
SegmentTree(int n) {
val.assign(4 * n + 1, 0);
cong.assign(4 * n + 1, 0);
lazy.assign(4 * n + 1, 0);
build(1, 1, n);
}
void pushLazy(int idx, int l, int r) {
if (lazy[idx] == 0) return;
val[idx] += cong[idx] * lazy[idx];
if (l < r) {
lazy[2 * idx] += lazy[idx];
lazy[2 * idx + 1] += lazy[idx];
}
lazy[idx] = 0;
}
void update(int idx, int l, int r, int x, int y, ll tri) {
pushLazy(idx, l, r);
if (y < l || r < x) return;
if (x <= l && r <= y) {
lazy[idx] += tri;
pushLazy(idx, l, r);
return;
}
int mid = (l + r) >> 1;
update(idx * 2, l, mid, x, y, tri);
update(idx * 2 + 1, mid + 1, r, x, y, tri);
val[idx] = val[2 * idx] + val[2 * idx + 1];
}
void point_update(int idx, int l, int r, int pos, ll tri) {
if (l == r) {
lazy[idx] += tri;
pushLazy(idx, l, r);
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) point_update(2 * idx, l, mid, pos, tri);
else point_update(2 * idx + 1, mid + 1, r, pos, tri);
val[idx] = val[2 * idx] + val[2 * idx + 1];
}
ll query(int idx, int l, int r, int x, int y) {
pushLazy(idx, l, r);
if (y < l || r < x) return 0;
if (x <= l && r <= y) {
return val[idx];
}
int mid = (l + r) >> 1;
return query(idx * 2, l, mid, x, y) + query(idx * 2 + 1, mid + 1, r, x, y);
}
ll point_query(int idx, int l, int r, int pos) {
pushLazy(idx, l, r);
if (l == r) return val[idx];
int mid = (l + r) >> 1;
if (pos <= mid) return point_query(idx * 2, l, mid, pos);
else return point_query(idx * 2 + 1, mid + 1, r, pos);
}
};
void dfs(int u, int p) {
rmq[u][0] = p;
height[u]++;
euler[timer++] = u;
for (int i = 1; i < LOG; i++) {
rmq[u][i] = rmq[rmq[u][i - 1]][i - 1];
}
for (int ve : tre[u]) {
if (ve == p) continue;
height[ve] = height[u];
dfs(ve, u);
}
euler[timer++] = u;
}
int LCA(int u, int v) {
if (height[u] < height[v]) swap(u, v);
int len = height[u] - height[v];
for (int i = LOG - 1; i >= 0; i--) {
if (len & (1 << i)) u = rmq[u][i];
}
if (u == v) return u;
for (int i = LOG - 1; i >= 0; i--) {
if (rmq[u][i] != rmq[v][i]) {
u = rmq[u][i];
v = rmq[v][i];
}
}
return rmq[u][0];
}
void solve()
{
int n, q;
cin >> n >> q;
for (int i = 0; i < n - 1; i++) {
int a, b;
cin >> a >> b;
tre[a].push_back(b);
tre[b].push_back(a);
}
dfs(1, 1);
for (int i = 1; i < timer; i++) {
if (in[euler[i]] == 0) in[euler[i]] = i;
out[euler[i]] = i;
}
for (int i = 1; i <= n; i++) euler[in[i]] = 1, euler[out[i]] = -1;
int m = timer - 1;
SegmentTree tree(m);
while (q--) {
int t, u, x;
cin >> t >> u >> x;
if (t == 1) {
tree.update(1, 1, m, in[u], out[u], x);
} else if (t == 2) {
tree.point_update(1, 1, m, in[u], x);
tree.point_update(1, 1, m, out[u], x);
} else {
int v = x;
int uv = LCA(u, v);
ll d1u = tree.query(1, 1, m, in[uv], in[u]);
ll d1v = tree.query(1, 1, m, in[uv], in[v]);
ll val_uv = tree.query(1, 1, m, in[uv], in[uv]);
ll res = d1u + d1v - val_uv;
cout << res << endl;
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
// freopen("K-query.inp", "r", stdin);
// freopen("K-query.ans", "w", stdout)
int t = 1;
// cin >> t; // DLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
while (t--)
{
solve();
}
return 0;
}
Ly8gbnhoaG9hbmcgLSB0aGUgZHJlYW1lcgovLyBnKysgLXN0ZD1jKysxMSAtV2FsbCAtV2V4dHJhIC1PMiBCLmNwcCAtbyBCLmV4ZQoKLy8gX19idWlsdGluX3BvcGNvdW50KHgpOyAtIGNvdW50IGJpdHMgMQovLyBfX2J1aWx0aW5fcGFyaXR5KHgpOyBudW1zIG9mIDEgKGV2ZW4gb3Igb2RkKQovLyBfX2J1aWx0aW5fY3R6KHgpOyBjb3VudCB0cmFpbGluZyB6ZXJvcwovLyBfX2J1aWx0aW5fY2x6KHgpOyBjb3VudCBsZWFkaW5nIHplcm9zCgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KCiNkZWZpbmUgRk9SKGksIGEsIGIpIGZvciAoaW50IGkgPSAoYSksIF9iID0gKGIpOyBpIDwgX2I7IGkrKykKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBkZWJ1Zyh4KSBjb3V0IDw8ICN4IDw8ICIgPSAiIDw8IHggPDwgJ1xuJwojZGVmaW5lIHViIHVwcGVyX2JvdW5kIC8vIGZpbmQgdGFyZ2V0IDwgbWluKHZhbHVlKQojZGVmaW5lIGxiIGxvd2VyX2JvdW5kIC8vIGZpbmQgdGFyZ2V0IDw9IG1pbih2YWx1ZSkKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIFNJWkUoeCkgKGludCkoeCkuc2l6ZSgpCgojZGVmaW5lIGFsbChhKSAoYSkuYmVnaW4oKSwgKGEpLmVuZCgpCiNkZWZpbmUgcGlpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgcGxsIHBhaXI8bGwsIGxsPgojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdmxsIHZlY3RvcjxsbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbGwgPSBsb25nIGxvbmc7CnVzaW5nIHVsbCA9IHVuc2lnbmVkIGxvbmcgbG9uZzsKCmNvbnN0IGludCBNU0laRSA9IDJlNSArIDU7CmNvbnN0IGludCBNQVhOID0gNGU3ICsgNTsKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBkeFtdID0gezEsIC0xLCAwLCAwfTsKY29uc3QgaW50IGR5W10gPSB7MCwgMCwgMSwgLTF9OwoKY29uc3QgaW50IExPRyA9IDE5OwoKdmVjdG9yPHZpPiB0cmUoTVNJWkUpOwppbnQgZXVsZXJbMiAqIE1TSVpFXSwgaW5bTVNJWkVdLCBvdXRbTVNJWkVdLCBoZWlnaHRbTVNJWkVdOwppbnQgdGltZXIgPSAxOwp2ZWN0b3I8dmk+IHJtcShNU0laRSwgdmkoMjAsIDApKTsKCnN0cnVjdCBTZWdtZW50VHJlZSB7CiAgICB2ZWN0b3I8bGw+IHZhbDsKICAgIHZlY3RvcjxpbnQ+IGNvbmc7CiAgICB2ZWN0b3I8bGw+IGxhenk7CgogICAgdm9pZCBidWlsZChpbnQgaWR4LCBpbnQgbCwgaW50IHIpIHsKICAgICAgICBpZiAobCA9PSByKSB7CiAgICAgICAgICAgIGlmIChldWxlcltsXSA9PSAtMSkgY29uZ1tpZHhdLS07CiAgICAgICAgICAgIGVsc2UgY29uZ1tpZHhdKys7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICAgICAgYnVpbGQoMiAqIGlkeCwgbCwgbWlkKTsKICAgICAgICBidWlsZCgyICogaWR4ICsgMSwgbWlkICsgMSwgcik7CiAgICAgICAgY29uZ1tpZHhdID0gY29uZ1tpZHggKiAyXSArIGNvbmdbaWR4ICogMiArIDFdOwogICAgfQoKICAgIFNlZ21lbnRUcmVlKGludCBuKSB7CiAgICAgICAgdmFsLmFzc2lnbig0ICogbiArIDEsIDApOwogICAgICAgIGNvbmcuYXNzaWduKDQgKiBuICsgMSwgMCk7CiAgICAgICAgbGF6eS5hc3NpZ24oNCAqIG4gKyAxLCAwKTsKICAgICAgICBidWlsZCgxLCAxLCBuKTsKICAgIH0KCiAgICB2b2lkIHB1c2hMYXp5KGludCBpZHgsIGludCBsLCBpbnQgcikgewogICAgICAgIGlmIChsYXp5W2lkeF0gPT0gMCkgcmV0dXJuOwogICAgICAgIHZhbFtpZHhdICs9IGNvbmdbaWR4XSAqIGxhenlbaWR4XTsKICAgICAgICBpZiAobCA8IHIpIHsKICAgICAgICAgICAgbGF6eVsyICogaWR4XSArPSBsYXp5W2lkeF07CiAgICAgICAgICAgIGxhenlbMiAqIGlkeCArIDFdICs9IGxhenlbaWR4XTsKICAgICAgICB9CiAgICAgICAgbGF6eVtpZHhdID0gMDsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZShpbnQgaWR4LCBpbnQgbCwgaW50IHIsIGludCB4LCBpbnQgeSwgbGwgdHJpKSB7CiAgICAgICAgcHVzaExhenkoaWR4LCBsLCByKTsKICAgICAgICBpZiAoeSA8IGwgfHwgciA8IHgpIHJldHVybjsKCiAgICAgICAgaWYgKHggPD0gbCAmJiByIDw9IHkpIHsKICAgICAgICAgICAgbGF6eVtpZHhdICs9IHRyaTsKICAgICAgICAgICAgcHVzaExhenkoaWR4LCBsLCByKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICB1cGRhdGUoaWR4ICogMiwgbCwgbWlkLCB4LCB5LCB0cmkpOwogICAgICAgIHVwZGF0ZShpZHggKiAyICsgMSwgbWlkICsgMSwgciwgeCwgeSwgdHJpKTsKICAgICAgICAKICAgICAgICB2YWxbaWR4XSA9IHZhbFsyICogaWR4XSArIHZhbFsyICogaWR4ICsgMV07CiAgICB9CgogICAgdm9pZCBwb2ludF91cGRhdGUoaW50IGlkeCwgaW50IGwsIGludCByLCBpbnQgcG9zLCBsbCB0cmkpIHsKICAgICAgICBpZiAobCA9PSByKSB7CiAgICAgICAgICAgIGxhenlbaWR4XSArPSB0cmk7CiAgICAgICAgICAgIHB1c2hMYXp5KGlkeCwgbCwgcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICAgICAgaWYgKHBvcyA8PSBtaWQpIHBvaW50X3VwZGF0ZSgyICogaWR4LCBsLCBtaWQsIHBvcywgdHJpKTsKICAgICAgICBlbHNlIHBvaW50X3VwZGF0ZSgyICogaWR4ICsgMSwgbWlkICsgMSwgciwgcG9zLCB0cmkpOwogICAgICAgIHZhbFtpZHhdID0gdmFsWzIgKiBpZHhdICsgdmFsWzIgKiBpZHggKyAxXTsKICAgIH0KCiAgICBsbCBxdWVyeShpbnQgaWR4LCBpbnQgbCwgaW50IHIsIGludCB4LCBpbnQgeSkgewogICAgICAgIHB1c2hMYXp5KGlkeCwgbCwgcik7CiAgICAgICAgaWYgKHkgPCBsIHx8IHIgPCB4KSByZXR1cm4gMDsKCiAgICAgICAgaWYgKHggPD0gbCAmJiByIDw9IHkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbFtpZHhdOwogICAgICAgIH0KCiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICByZXR1cm4gcXVlcnkoaWR4ICogMiwgbCwgbWlkLCB4LCB5KSArIHF1ZXJ5KGlkeCAqIDIgKyAxLCBtaWQgKyAxLCByLCB4LCB5KTsKICAgIH0KCiAgICBsbCBwb2ludF9xdWVyeShpbnQgaWR4LCBpbnQgbCwgaW50IHIsIGludCBwb3MpIHsKICAgICAgICBwdXNoTGF6eShpZHgsIGwsIHIpOwogICAgICAgIGlmIChsID09IHIpIHJldHVybiB2YWxbaWR4XTsKCiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICBpZiAocG9zIDw9IG1pZCkgcmV0dXJuIHBvaW50X3F1ZXJ5KGlkeCAqIDIsIGwsIG1pZCwgcG9zKTsKICAgICAgICBlbHNlIHJldHVybiBwb2ludF9xdWVyeShpZHggKiAyICsgMSwgbWlkICsgMSwgciwgcG9zKTsKICAgIH0KfTsKCnZvaWQgZGZzKGludCB1LCBpbnQgcCkgewogICAgcm1xW3VdWzBdID0gcDsKICAgIGhlaWdodFt1XSsrOwogICAgZXVsZXJbdGltZXIrK10gPSB1OwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTE9HOyBpKyspIHsKICAgICAgICBybXFbdV1baV0gPSBybXFbcm1xW3VdW2kgLSAxXV1baSAtIDFdOwogICAgfQoKICAgIGZvciAoaW50IHZlIDogdHJlW3VdKSB7CiAgICAgICAgaWYgKHZlID09IHApIGNvbnRpbnVlOwogICAgICAgIGhlaWdodFt2ZV0gPSBoZWlnaHRbdV07CiAgICAgICAgZGZzKHZlLCB1KTsKICAgIH0KICAgIGV1bGVyW3RpbWVyKytdID0gdTsKfQoKaW50IExDQShpbnQgdSwgaW50IHYpIHsKICAgIGlmIChoZWlnaHRbdV0gPCBoZWlnaHRbdl0pIHN3YXAodSwgdik7CgogICAgaW50IGxlbiA9IGhlaWdodFt1XSAtIGhlaWdodFt2XTsKICAgIGZvciAoaW50IGkgPSBMT0cgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIGlmIChsZW4gJiAoMSA8PCBpKSkgdSA9IHJtcVt1XVtpXTsKICAgIH0KCiAgICBpZiAodSA9PSB2KSByZXR1cm4gdTsKCiAgICBmb3IgKGludCBpID0gTE9HIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBpZiAocm1xW3VdW2ldICE9IHJtcVt2XVtpXSkgewogICAgICAgICAgICB1ID0gcm1xW3VdW2ldOwogICAgICAgICAgICB2ID0gcm1xW3ZdW2ldOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBybXFbdV1bMF07Cn0KCnZvaWQgc29sdmUoKQp7CiAgICBpbnQgbiwgcTsKICAgIGNpbiA+PiBuID4+IHE7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7CiAgICAgICAgaW50IGEsIGI7CiAgICAgICAgY2luID4+IGEgPj4gYjsKCiAgICAgICAgdHJlW2FdLnB1c2hfYmFjayhiKTsKICAgICAgICB0cmVbYl0ucHVzaF9iYWNrKGEpOwogICAgfQoKICAgIGRmcygxLCAxKTsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8IHRpbWVyOyBpKyspIHsKICAgICAgICBpZiAoaW5bZXVsZXJbaV1dID09IDApIGluW2V1bGVyW2ldXSA9IGk7CiAgICAgICAgb3V0W2V1bGVyW2ldXSA9IGk7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBldWxlcltpbltpXV0gPSAxLCBldWxlcltvdXRbaV1dID0gLTE7CiAgICBpbnQgbSA9IHRpbWVyIC0gMTsKICAgIFNlZ21lbnRUcmVlIHRyZWUobSk7CgogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGludCB0LCB1LCB4OwogICAgICAgIGNpbiA+PiB0ID4+IHUgPj4geDsKCiAgICAgICAgCiAgICAgICAgaWYgKHQgPT0gMSkgewogICAgICAgICAgICB0cmVlLnVwZGF0ZSgxLCAxLCBtLCBpblt1XSwgb3V0W3VdLCB4KTsKICAgICAgICB9IGVsc2UgaWYgKHQgPT0gMikgewogICAgICAgICAgICB0cmVlLnBvaW50X3VwZGF0ZSgxLCAxLCBtLCBpblt1XSwgeCk7CiAgICAgICAgICAgIHRyZWUucG9pbnRfdXBkYXRlKDEsIDEsIG0sIG91dFt1XSwgeCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IHYgPSB4OwogICAgICAgICAgICBpbnQgdXYgPSBMQ0EodSwgdik7CiAgICAgICAgICAgIGxsIGQxdSA9IHRyZWUucXVlcnkoMSwgMSwgbSwgaW5bdXZdLCBpblt1XSk7CiAgICAgICAgICAgIGxsIGQxdiA9IHRyZWUucXVlcnkoMSwgMSwgbSwgaW5bdXZdLCBpblt2XSk7CiAgICAgICAgICAgIGxsIHZhbF91diA9IHRyZWUucXVlcnkoMSwgMSwgbSwgaW5bdXZdLCBpblt1dl0pOwogCiAgICAgICAgICAgIGxsIHJlcyA9IGQxdSArIGQxdiAtIHZhbF91djsKICAgICAgICAgICAgY291dCA8PCByZXMgPDwgZW5kbDsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwogICAgLy8gZnJlb3BlbigiSy1xdWVyeS5pbnAiLCAiciIsIHN0ZGluKTsKICAgIC8vIGZyZW9wZW4oIkstcXVlcnkuYW5zIiwgInciLCBzdGRvdXQpCiAgICBpbnQgdCA9IDE7CiAgICAvLyBjaW4gPj4gdDsgLy8gRExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAoKCiAgICB3aGlsZSAodC0tKQogICAgewogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==