#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
// - Ta cần giải quyết 2 bài toán lớn trong bài này:
// 1. Tính lca(u, v) với root bất kì
// 2. Update/Get giá trị của một cây con gốc u với root bất kì
// - Ở cả 2 bài toán thì ta đều sẽ chọn cây với gốc là 1 (lca, tin, tout)
// - Bài toán 1 thì các em tham khảo sol bài dynamic LCA
// - Với Bài toán 2 thì thật ra chỉ đòi hỏi khả năng casework (xét trường hợp) chứ không hề khó:
// TH1: u = root:
// -> Update/Get cả cây
// TH2: u != root:
// 2.1: u và root có quan hệ tổ tiên:
// a) root là tổ tiên của u:
// -> Update/Get cây con gốc u
// b) u là tổ tiên của root:
// -> Gọi v là đỉnh con của u mà là tổ tiên của root
// -> Update/Get các đỉnh nằm ngoài cây con gốc v
// 2.2: u và root không có quan hệ tổ tiên (nằm khác nhánh)
// -> Update/Get cây con gốc u
const int N = 1e5 + 5;
const int LOG = 17;
int n, q;
int a[N];
vector<int> adj[N];
int up[LOG][N];
int tin[N], tout[N], timer;
void dfs(int u, int p) {
tin[u] = ++timer;
up[0][u] = p;
for (int i = 1; i < LOG; i++) {
up[i][u] = up[i - 1][up[i - 1][u]];
}
for (int v : adj[u]) {
if (v == p) continue;
dfs(v, u);
}
tout[u] = timer;
}
bool isAncestor(int u, int v) {
return (tin[u] <= tin[v] && tout[v] <= tout[u]);
}
int nextOnPath(int u, int v) {
for (int i = LOG - 1; i >= 0; i--) {
if (!isAncestor(up[i][v], u)) {
v = up[i][v];
}
}
return v;
}
int lca(int u, int v) {
if (isAncestor(u, v)) return u;
if (isAncestor(v, u)) return v;
for (int i = LOG - 1; i >= 0; i--) {
if (!isAncestor(up[i][u], v)) {
u = up[i][u];
}
}
return up[0][u];
}
struct SegTree {
int n;
vector<ll> seg;
vector<ll> lazy;
SegTree() {}
SegTree(int n) : n(n) {
seg.resize(4 * n, 0);
lazy.resize(4 * n, 0);
}
void push(int id, int l, int r) {
if (lazy[id]) {
int mid = (l + r) >> 1;
seg[id * 2] += (mid - l + 1) * lazy[id];
lazy[id * 2] += lazy[id];
seg[id * 2 + 1] += (r - mid) * lazy[id];
lazy[id * 2 + 1] += lazy[id];
lazy[id] = 0;
}
}
void update(int id, int l, int r, int u, int v, int val) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
seg[id] += 1ll * (r - l + 1) * val;
lazy[id] += val;
return;
}
push(id, l, r);
int mid = (l + r) >> 1;
update(id * 2, l, mid, u, v, val);
update(id * 2 + 1, mid + 1, r, u, v, val);
seg[id] = seg[id * 2] + seg[id * 2 + 1];
}
ll get(int id, int l, int r, int u, int v) {
if (l > v || r < u) return 0;
if (u <= l && r <= v) return seg[id];
push(id, l, r);
int mid = (l + r) >> 1;
return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
}
};
SegTree segtree;
void updateSubtree(int u, int val, int root) {
if (u == root) {
segtree.update(1, 1, n, 1, n, val);
return;
}
if (isAncestor(root, u)) {
segtree.update(1, 1, n, tin[u], tout[u], val);
return;
}
if (isAncestor(u, root)) {
int v = nextOnPath(u, root);
segtree.update(1, 1, n, 1, n, val);
segtree.update(1, 1, n, tin[v], tout[v], -val);
return;
}
segtree.update(1, 1, n, tin[u], tout[u], val);
}
ll querySubtree(int u, int root) {
if (u == root) {
return segtree.seg[1];
}
if (isAncestor(root, u)) {
return segtree.get(1, 1, n, tin[u], tout[u]);
}
if (isAncestor(u, root)) {
int v = nextOnPath(u, root);
return segtree.seg[1] - segtree.get(1, 1, n, tin[v], tout[v]);
}
return segtree.get(1, 1, n, tin[u], tout[u]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
for (int u = 1; u <= n; u++) cin >> a[u];
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
int root = 1;
timer = 0;
dfs(1, 1);
segtree = SegTree(n + 1);
for (int u = 1; u <= n; u++) {
segtree.update(1, 1, n, tin[u], tin[u], a[u]);
}
while (q--) {
int type; cin >> type;
if (type == 1) {
int nroot; cin >> nroot;
root = nroot;
}
else if (type == 2) {
int u, v, val;
cin >> u >> v >> val;
int lca_uv = lca(u, v) ^ lca(u, root) ^ lca(v, root);
updateSubtree(lca_uv, val, root);
}
else {
int u; cin >> u;
cout << querySubtree(u, root) << '\n';
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKLy8gLSBUYSBj4bqnbiBnaeG6o2kgcXV54bq/dCAyIGLDoGkgdG/DoW4gbOG7m24gdHJvbmcgYsOgaSBuw6B5OiAKLy8gMS4gVMOtbmggbGNhKHUsIHYpIHbhu5tpIHJvb3QgYuG6pXQga8OsCi8vIDIuIFVwZGF0ZS9HZXQgZ2nDoSB0cuG7iyBj4bunYSBt4buZdCBjw6J5IGNvbiBn4buRYyB1IHbhu5tpIHJvb3QgYuG6pXQga8OsCi8vIC0g4bueIGPhuqMgMiBiw6BpIHRvw6FuIHRow6wgdGEgxJHhu4F1IHPhur0gY2jhu41uIGPDonkgduG7m2kgZ+G7kWMgbMOgIDEgKGxjYSwgdGluLCB0b3V0KQovLyAtIELDoGkgdG/DoW4gMSB0aMOsIGPDoWMgZW0gdGhhbSBraOG6o28gc29sIGLDoGkgZHluYW1pYyBMQ0EKLy8gLSBW4bubaSBCw6BpIHRvw6FuIDIgdGjDrCB0aOG6rXQgcmEgY2jhu4kgxJHDsmkgaOG7j2kga2jhuqMgbsSDbmcgY2FzZXdvcmsgKHjDqXQgdHLGsOG7nW5nIGjhu6NwKSBjaOG7qSBraMO0bmcgaOG7gSBraMOzOgovLyBUSDE6IHUgPSByb290OiAKLy8gLT4gVXBkYXRlL0dldCBj4bqjIGPDonkKLy8gVEgyOiB1ICE9IHJvb3Q6IAovLyAyLjE6IHUgdsOgIHJvb3QgY8OzIHF1YW4gaOG7hyB04buVIHRpw6puOgovLyBhKSByb290IGzDoCB04buVIHRpw6puIGPhu6dhIHU6Ci8vIC0+IFVwZGF0ZS9HZXQgY8OieSBjb24gZ+G7kWMgdQovLyBiKSB1IGzDoCB04buVIHRpw6puIGPhu6dhIHJvb3Q6Ci8vIC0+IEfhu41pIHYgbMOgIMSR4buJbmggY29uIGPhu6dhIHUgbcOgIGzDoCB04buVIHRpw6puIGPhu6dhIHJvb3QKLy8gLT4gVXBkYXRlL0dldCBjw6FjIMSR4buJbmggbuG6sW0gbmdvw6BpIGPDonkgY29uIGfhu5FjIHYKLy8gMi4yOiB1IHbDoCByb290IGtow7RuZyBjw7MgcXVhbiBo4buHIHThu5UgdGnDqm4gKG7hurFtIGtow6FjIG5ow6FuaCkKLy8gLT4gVXBkYXRlL0dldCBjw6J5IGNvbiBn4buRYyB1IAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKY29uc3QgaW50IExPRyA9IDE3OyAgCgppbnQgbiwgcTsgCmludCBhW05dOyAKdmVjdG9yPGludD4gYWRqW05dOyAKCmludCB1cFtMT0ddW05dOyAKaW50IHRpbltOXSwgdG91dFtOXSwgdGltZXI7IAoKdm9pZCBkZnMoaW50IHUsIGludCBwKSB7Cgl0aW5bdV0gPSArK3RpbWVyOyAKCXVwWzBdW3VdID0gcDsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPCBMT0c7IGkrKykgewoJCXVwW2ldW3VdID0gdXBbaSAtIDFdW3VwW2kgLSAxXVt1XV07Cgl9Cglmb3IgKGludCB2IDogYWRqW3VdKSB7CgkJaWYgKHYgPT0gcCkgY29udGludWU7IAoJCWRmcyh2LCB1KTsgCgl9Cgl0b3V0W3VdID0gdGltZXI7IAp9Cgpib29sIGlzQW5jZXN0b3IoaW50IHUsIGludCB2KSB7CglyZXR1cm4gKHRpblt1XSA8PSB0aW5bdl0gJiYgdG91dFt2XSA8PSB0b3V0W3VdKTsgCn0KCmludCBuZXh0T25QYXRoKGludCB1LCBpbnQgdikgewoJZm9yIChpbnQgaSA9IExPRyAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJaWYgKCFpc0FuY2VzdG9yKHVwW2ldW3ZdLCB1KSkgewoJCQl2ID0gdXBbaV1bdl07IAoJCX0KCX0KCXJldHVybiB2OyAKfQoKaW50IGxjYShpbnQgdSwgaW50IHYpIHsKCWlmIChpc0FuY2VzdG9yKHUsIHYpKSByZXR1cm4gdTsgCglpZiAoaXNBbmNlc3Rvcih2LCB1KSkgcmV0dXJuIHY7IAoJZm9yIChpbnQgaSA9IExPRyAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJaWYgKCFpc0FuY2VzdG9yKHVwW2ldW3VdLCB2KSkgewoJCQl1ID0gdXBbaV1bdV07IAoJCX0KCX0KCXJldHVybiB1cFswXVt1XTsKfQoKc3RydWN0IFNlZ1RyZWUgewoJaW50IG47ICAKCXZlY3RvcjxsbD4gc2VnOyAKCXZlY3RvcjxsbD4gbGF6eTsgICAKCglTZWdUcmVlKCkge30KCglTZWdUcmVlKGludCBuKSA6IG4obikgewoJCXNlZy5yZXNpemUoNCAqIG4sIDApOyAKCQlsYXp5LnJlc2l6ZSg0ICogbiwgMCk7IAoJfQoKCXZvaWQgcHVzaChpbnQgaWQsIGludCBsLCBpbnQgcikgewoJCWlmIChsYXp5W2lkXSkgewoJCQlpbnQgbWlkID0gKGwgKyByKSA+PiAxOyAKCQkJc2VnW2lkICogMl0gKz0gKG1pZCAtIGwgKyAxKSAqIGxhenlbaWRdOyAKCQkJbGF6eVtpZCAqIDJdICs9IGxhenlbaWRdOyAKCQkJc2VnW2lkICogMiArIDFdICs9IChyIC0gbWlkKSAqIGxhenlbaWRdOwoJCQlsYXp5W2lkICogMiArIDFdICs9IGxhenlbaWRdOyAKCQkJbGF6eVtpZF0gPSAwOyAgCgkJfQoJfQoKCXZvaWQgdXBkYXRlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGludCB2YWwpIHsKCQlpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybjsgCgkJaWYgKHUgPD0gbCAmJiByIDw9IHYpIHsKCQkJc2VnW2lkXSArPSAxbGwgKiAociAtIGwgKyAxKSAqIHZhbDsgCgkJCWxhenlbaWRdICs9IHZhbDsgCgkJCXJldHVybjsgCgkJfQoJCXB1c2goaWQsIGwsIHIpOyAKCQlpbnQgbWlkID0gKGwgKyByKSA+PiAxOyAKCQl1cGRhdGUoaWQgKiAyLCBsLCBtaWQsIHUsIHYsIHZhbCk7IAoJCXVwZGF0ZShpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCB1LCB2LCB2YWwpOyAKCQlzZWdbaWRdID0gc2VnW2lkICogMl0gKyBzZWdbaWQgKiAyICsgMV07IAoJfQoKCWxsIGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CgkJaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm4gMDsgIAoJCWlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gc2VnW2lkXTsgCgkJcHVzaChpZCwgbCwgcik7IAoJCWludCBtaWQgPSAobCArIHIpID4+IDE7IAoJCXJldHVybiBnZXQoaWQgKiAyLCBsLCBtaWQsIHUsIHYpICsgZ2V0KGlkICogMiArIDEsIG1pZCArIDEsIHIsIHUsIHYpOyAKCX0KfTsgCgpTZWdUcmVlIHNlZ3RyZWU7ICAKCnZvaWQgdXBkYXRlU3VidHJlZShpbnQgdSwgaW50IHZhbCwgaW50IHJvb3QpIHsKCWlmICh1ID09IHJvb3QpIHsKCQlzZWd0cmVlLnVwZGF0ZSgxLCAxLCBuLCAxLCBuLCB2YWwpOyAKCQlyZXR1cm47IAoJfQoJaWYgKGlzQW5jZXN0b3Iocm9vdCwgdSkpIHsKCQlzZWd0cmVlLnVwZGF0ZSgxLCAxLCBuLCB0aW5bdV0sIHRvdXRbdV0sIHZhbCk7IAoJCXJldHVybjsgCgl9CglpZiAoaXNBbmNlc3Rvcih1LCByb290KSkgewoJCWludCB2ID0gbmV4dE9uUGF0aCh1LCByb290KTsgIAoJCXNlZ3RyZWUudXBkYXRlKDEsIDEsIG4sIDEsIG4sIHZhbCk7IAoJCXNlZ3RyZWUudXBkYXRlKDEsIDEsIG4sIHRpblt2XSwgdG91dFt2XSwgLXZhbCk7IAkKCQlyZXR1cm47IAkKCX0KCXNlZ3RyZWUudXBkYXRlKDEsIDEsIG4sIHRpblt1XSwgdG91dFt1XSwgdmFsKTsgCn0KCmxsIHF1ZXJ5U3VidHJlZShpbnQgdSwgaW50IHJvb3QpIHsKCWlmICh1ID09IHJvb3QpIHsKCQlyZXR1cm4gc2VndHJlZS5zZWdbMV07IAoJfQoJaWYgKGlzQW5jZXN0b3Iocm9vdCwgdSkpIHsKCQlyZXR1cm4gc2VndHJlZS5nZXQoMSwgMSwgbiwgdGluW3VdLCB0b3V0W3VdKTsgCgl9CglpZiAoaXNBbmNlc3Rvcih1LCByb290KSkgewoJCWludCB2ID0gbmV4dE9uUGF0aCh1LCByb290KTsgIAoJCXJldHVybiBzZWd0cmVlLnNlZ1sxXSAtIHNlZ3RyZWUuZ2V0KDEsIDEsIG4sIHRpblt2XSwgdG91dFt2XSk7IAoJfQoJcmV0dXJuIHNlZ3RyZWUuZ2V0KDEsIDEsIG4sIHRpblt1XSwgdG91dFt1XSk7IAp9CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAJCgljaW4gPj4gbiA+PiBxOwoJZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSBjaW4gPj4gYVt1XTsgCgoJZm9yIChpbnQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7CgkJaW50IHUsIHY7IAoJCWNpbiA+PiB1ID4+IHY7IAoJCWFkalt1XS5wdXNoX2JhY2sodik7IAoJCWFkalt2XS5wdXNoX2JhY2sodSk7IAoJfQoKCWludCByb290ID0gMTsgIAoJdGltZXIgPSAwOyAKCWRmcygxLCAxKTsgICAKCglzZWd0cmVlID0gU2VnVHJlZShuICsgMSk7IAoJZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSB7CgkJc2VndHJlZS51cGRhdGUoMSwgMSwgbiwgdGluW3VdLCB0aW5bdV0sIGFbdV0pOyAgCgl9CgoJd2hpbGUgKHEtLSkgewoJCWludCB0eXBlOyBjaW4gPj4gdHlwZTsgCgoJCWlmICh0eXBlID09IDEpIHsKCQkJaW50IG5yb290OyBjaW4gPj4gbnJvb3Q7IAoJCQlyb290ID0gbnJvb3Q7IAoJCX0KCQllbHNlIGlmICh0eXBlID09IDIpIHsKCQkJaW50IHUsIHYsIHZhbDsgCgkJCWNpbiA+PiB1ID4+IHYgPj4gdmFsOyAgCgkJCWludCBsY2FfdXYgPSBsY2EodSwgdikgXiBsY2EodSwgcm9vdCkgXiBsY2Eodiwgcm9vdCk7IAoJCQl1cGRhdGVTdWJ0cmVlKGxjYV91diwgdmFsLCByb290KTsgCgkJfQoJCWVsc2UgewoJCQlpbnQgdTsgY2luID4+IHU7ICAKCQkJY291dCA8PCBxdWVyeVN1YnRyZWUodSwgcm9vdCkgPDwgJ1xuJzsgCgkJfQkKCX0KfQo=