#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 10;
struct Node {
int cnt, col, lm, rm;
};
vector<int> adj[N];
int a[N], dep[N], fa[N], hson[N], sz[N], top[N], dfn[N], ord[N];
Node sgt[N*4];
int n, m, t;
void dfs1(int u, int p) {
sz[u] = 1;
for (int v: adj[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;
ord[t] = u;
if (!hson[u]) return;
top[hson[u]] = top[u];
dfs2(hson[u], u);
for (int v: adj[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].col) {
int mid = (begin + end) / 2;
sgt[index*2] = sgt[index*2+1] = {1, sgt[index].col, sgt[index].col, sgt[index].col};
sgt[index].col = 0;
}
}
void push_up(int index) {
sgt[index].cnt = sgt[index*2].cnt + sgt[index*2+1].cnt;
if (sgt[index*2].rm == sgt[index*2+1].lm) sgt[index].cnt --;
sgt[index].lm = sgt[index*2].lm;
sgt[index].rm = sgt[index*2+1].rm;
}
void build(int index, int begin, int end) {
if (begin >= end) {
sgt[index] = {1, 0, a[ord[begin]], a[ord[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] = {1, val, val, 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);
}
Node query(int index, int begin, int end, int left, int right) {
if (left <= begin && right >= end) return sgt[index];
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 {
Node node1 = query(index * 2, begin, mid, left, mid);
Node node2 = query(index * 2 + 1, mid + 1, end, mid + 1, right);
int cnt = node1.cnt + node2.cnt;
if (node1.rm == node2.lm) cnt --;
return (Node){cnt, 0, node1.lm, node2.rm};
}
}
void update(int u, int v, int c) {
int fu = top[u], fv = top[v];
while (fu != fv) {
if (dep[fu] >= dep[fv]) {
update(1, 1, n, dfn[fu], dfn[u], c);
u = fa[fu];
}
else {
update(1, 1, n, dfn[fv], dfn[v], c);
v = fa[fv];
}
fu = top[u];
fv = top[v];
}
if (dfn[u] <= dfn[v]) update(1, 1, n, dfn[u], dfn[v], c);
else update(1, 1, n, dfn[v], dfn[u], c);
}
int query(int u, int v) {
int s = 0, fu = top[u], fv = top[v], c1 = -1, c2 = -1;
Node node;
while (fu != fv) {
if (dep[fu] >= dep[fv]) {
node = query(1, 1, n, dfn[fu], dfn[u]);
s += node.cnt;
if (c1 == node.rm) s --;
c1 = node.lm;
u = fa[fu];
}
else {
node = query(1, 1, n, dfn[fv], dfn[v]);
s += node.cnt;
if (c2 == node.rm) s --;
c2 = node.lm;
v = fa[fv];
}
fu = top[u];
fv = top[v];
}
if (dfn[u] <= dfn[v]) {
node = query(1, 1, n, dfn[u], dfn[v]);
s += node.cnt;
if (c1 == node.lm) s --;
if (c2 == node.rm) s --;
}
else {
node = query(1, 1, n, dfn[v], dfn[u]);
s += node.cnt;
if (c1 == node.rm) s --;
if (c2 == node.lm) s --;
}
return s;
}
int main() {
int u, v, c;
char op;
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);
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs1(1, -1);
top[1] = fa[1] = 1;
dfs2(1, -1);
build(1, 1, n);
while (m --) {
scanf(" %c", &op);
if (op == 'C') {
scanf("%d %d %d", &u, &v, &c);
update(u, v, c);
}
else {
scanf("%d %d", &u, &v);
printf("%d\n", query(u, v));
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE4gPSAxMDAwMDAgKyAxMDsKCnN0cnVjdCBOb2RlIHsKCWludCBjbnQsIGNvbCwgbG0sIHJtOwp9OwoKdmVjdG9yPGludD4gYWRqW05dOwppbnQgYVtOXSwgZGVwW05dLCBmYVtOXSwgaHNvbltOXSwgc3pbTl0sIHRvcFtOXSwgZGZuW05dLCBvcmRbTl07Ck5vZGUgc2d0W04qNF07CmludCBuLCBtLCB0OwoKdm9pZCBkZnMxKGludCB1LCBpbnQgcCkgewoJc3pbdV0gPSAxOwoJZm9yIChpbnQgdjogYWRqW3VdKSB7CgkJaWYgKHYgPT0gcCkgY29udGludWU7CgkJZGVwW3ZdID0gZGVwW3VdICsgMTsKCQlmYVt2XSA9IHU7CgkJZGZzMSh2LCB1KTsKCQlzelt1XSArPSBzelt2XTsKCQlpZiAoIWhzb25bdV0gfHwgc3pbdl0gPiBzeltoc29uW3VdXSkgaHNvblt1XSA9IHY7Cgl9Cn0KCnZvaWQgZGZzMihpbnQgdSwgaW50IHApIHsKCWRmblt1XSA9ICsrIHQ7CglvcmRbdF0gPSB1OwoJaWYgKCFoc29uW3VdKSByZXR1cm47Cgl0b3BbaHNvblt1XV0gPSB0b3BbdV07CglkZnMyKGhzb25bdV0sIHUpOwoJZm9yIChpbnQgdjogYWRqW3VdKSB7CgkJaWYgKHYgPT0gcCB8fCB2ID09IGhzb25bdV0pIGNvbnRpbnVlOwoJCXRvcFt2XSA9IHY7CgkJZGZzMih2LCB1KTsKCX0KfQoKdm9pZCBwdXNoX2Rvd24oaW50IGluZGV4LCBpbnQgYmVnaW4sIGludCBlbmQpIHsKCWlmIChzZ3RbaW5kZXhdLmNvbCkgewoJCWludCBtaWQgPSAoYmVnaW4gKyBlbmQpIC8gMjsKCQlzZ3RbaW5kZXgqMl0gPSBzZ3RbaW5kZXgqMisxXSA9IHsxLCBzZ3RbaW5kZXhdLmNvbCwgc2d0W2luZGV4XS5jb2wsIHNndFtpbmRleF0uY29sfTsKCQlzZ3RbaW5kZXhdLmNvbCA9IDA7Cgl9Cn0KCnZvaWQgcHVzaF91cChpbnQgaW5kZXgpIHsKCXNndFtpbmRleF0uY250ID0gc2d0W2luZGV4KjJdLmNudCArIHNndFtpbmRleCoyKzFdLmNudDsKCWlmIChzZ3RbaW5kZXgqMl0ucm0gPT0gc2d0W2luZGV4KjIrMV0ubG0pIHNndFtpbmRleF0uY250IC0tOwoJc2d0W2luZGV4XS5sbSA9IHNndFtpbmRleCoyXS5sbTsKCXNndFtpbmRleF0ucm0gPSBzZ3RbaW5kZXgqMisxXS5ybTsKfQoKdm9pZCBidWlsZChpbnQgaW5kZXgsIGludCBiZWdpbiwgaW50IGVuZCkgewoJaWYgKGJlZ2luID49IGVuZCkgewoJCXNndFtpbmRleF0gPSB7MSwgMCwgYVtvcmRbYmVnaW5dXSwgYVtvcmRbYmVnaW5dXX07CgkJcmV0dXJuOwoJfQoJaW50IG1pZCA9IChiZWdpbiArIGVuZCkgLyAyOwoJYnVpbGQoaW5kZXggKiAyLCBiZWdpbiwgbWlkKTsKCWJ1aWxkKGluZGV4ICogMiArIDEsIG1pZCArIDEsIGVuZCk7CglwdXNoX3VwKGluZGV4KTsKfQoKdm9pZCB1cGRhdGUoaW50IGluZGV4LCBpbnQgYmVnaW4sIGludCBlbmQsIGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCB2YWwpIHsKCWlmIChsZWZ0IDw9IGJlZ2luICYmIHJpZ2h0ID49IGVuZCkgewoJCXNndFtpbmRleF0gPSB7MSwgdmFsLCB2YWwsIHZhbH07CgkJcmV0dXJuOwoJfQoJcHVzaF9kb3duKGluZGV4LCBiZWdpbiwgZW5kKTsKCWludCBtaWQgPSAoYmVnaW4gKyBlbmQpIC8gMjsKCWlmIChyaWdodCA8PSBtaWQpIHVwZGF0ZShpbmRleCAqIDIsIGJlZ2luLCBtaWQsIGxlZnQsIHJpZ2h0LCB2YWwpOwoJZWxzZSBpZiAobGVmdCA+IG1pZCkgdXBkYXRlKGluZGV4ICogMiArIDEsIG1pZCArIDEsIGVuZCwgbGVmdCwgcmlnaHQsIHZhbCk7CgllbHNlIHsKCQl1cGRhdGUoaW5kZXggKiAyLCBiZWdpbiwgbWlkLCBsZWZ0LCBtaWQsIHZhbCk7CgkJdXBkYXRlKGluZGV4ICogMiArIDEsIG1pZCArIDEsIGVuZCwgbWlkICsgMSwgcmlnaHQsIHZhbCk7Cgl9CglwdXNoX3VwKGluZGV4KTsKfQoKTm9kZSBxdWVyeShpbnQgaW5kZXgsIGludCBiZWdpbiwgaW50IGVuZCwgaW50IGxlZnQsIGludCByaWdodCkgewoJaWYgKGxlZnQgPD0gYmVnaW4gJiYgcmlnaHQgPj0gZW5kKSByZXR1cm4gc2d0W2luZGV4XTsKCXB1c2hfZG93bihpbmRleCwgYmVnaW4sIGVuZCk7CglpbnQgbWlkID0gKGJlZ2luICsgZW5kKSAvIDI7CglpZiAocmlnaHQgPD0gbWlkKSByZXR1cm4gcXVlcnkoaW5kZXggKiAyLCBiZWdpbiwgbWlkLCBsZWZ0LCByaWdodCk7CgllbHNlIGlmIChsZWZ0ID4gbWlkKSByZXR1cm4gcXVlcnkoaW5kZXggKiAyICsgMSwgbWlkICsgMSwgZW5kLCBsZWZ0LCByaWdodCk7CgllbHNlIHsKCQlOb2RlIG5vZGUxID0gcXVlcnkoaW5kZXggKiAyLCBiZWdpbiwgbWlkLCBsZWZ0LCBtaWQpOwoJCU5vZGUgbm9kZTIgPSBxdWVyeShpbmRleCAqIDIgKyAxLCBtaWQgKyAxLCBlbmQsIG1pZCArIDEsIHJpZ2h0KTsKCQlpbnQgY250ID0gbm9kZTEuY250ICsgbm9kZTIuY250OwoJCWlmIChub2RlMS5ybSA9PSBub2RlMi5sbSkgY250IC0tOwoJCXJldHVybiAoTm9kZSl7Y250LCAwLCBub2RlMS5sbSwgbm9kZTIucm19OwoJfQp9Cgp2b2lkIHVwZGF0ZShpbnQgdSwgaW50IHYsIGludCBjKSB7CglpbnQgZnUgPSB0b3BbdV0sIGZ2ID0gdG9wW3ZdOwoJd2hpbGUgKGZ1ICE9IGZ2KSB7CgkJaWYgKGRlcFtmdV0gPj0gZGVwW2Z2XSkgewoJCQl1cGRhdGUoMSwgMSwgbiwgZGZuW2Z1XSwgZGZuW3VdLCBjKTsKCQkJdSA9IGZhW2Z1XTsKCQl9CgkJZWxzZSB7CgkJCXVwZGF0ZSgxLCAxLCBuLCBkZm5bZnZdLCBkZm5bdl0sIGMpOwoJCQl2ID0gZmFbZnZdOwoJCX0KCQlmdSA9IHRvcFt1XTsKCQlmdiA9IHRvcFt2XTsKCX0KCWlmIChkZm5bdV0gPD0gZGZuW3ZdKSB1cGRhdGUoMSwgMSwgbiwgZGZuW3VdLCBkZm5bdl0sIGMpOwoJZWxzZSB1cGRhdGUoMSwgMSwgbiwgZGZuW3ZdLCBkZm5bdV0sIGMpOwp9CgppbnQgcXVlcnkoaW50IHUsIGludCB2KSB7CglpbnQgcyA9IDAsIGZ1ID0gdG9wW3VdLCBmdiA9IHRvcFt2XSwgYzEgPSAtMSwgYzIgPSAtMTsKCU5vZGUgbm9kZTsKCXdoaWxlIChmdSAhPSBmdikgewoJCWlmIChkZXBbZnVdID49IGRlcFtmdl0pIHsKCQkJbm9kZSA9IHF1ZXJ5KDEsIDEsIG4sIGRmbltmdV0sIGRmblt1XSk7CgkJCXMgKz0gbm9kZS5jbnQ7CgkJCWlmIChjMSA9PSBub2RlLnJtKSBzIC0tOwoJCQljMSA9IG5vZGUubG07CgkJCXUgPSBmYVtmdV07CgkJfQoJCWVsc2UgewoJCQlub2RlID0gcXVlcnkoMSwgMSwgbiwgZGZuW2Z2XSwgZGZuW3ZdKTsKCQkJcyArPSBub2RlLmNudDsKCQkJaWYgKGMyID09IG5vZGUucm0pIHMgLS07CgkJCWMyID0gbm9kZS5sbTsKCQkJdiA9IGZhW2Z2XTsKCQl9CgkJZnUgPSB0b3BbdV07CgkJZnYgPSB0b3Bbdl07Cgl9CglpZiAoZGZuW3VdIDw9IGRmblt2XSkgewoJCW5vZGUgPSBxdWVyeSgxLCAxLCBuLCBkZm5bdV0sIGRmblt2XSk7CgkJcyArPSBub2RlLmNudDsKCQlpZiAoYzEgPT0gbm9kZS5sbSkgcyAtLTsKCQlpZiAoYzIgPT0gbm9kZS5ybSkgcyAtLTsKCX0KCWVsc2UgewoJCW5vZGUgPSBxdWVyeSgxLCAxLCBuLCBkZm5bdl0sIGRmblt1XSk7CgkJcyArPSBub2RlLmNudDsKCQlpZiAoYzEgPT0gbm9kZS5ybSkgcyAtLTsKCQlpZiAoYzIgPT0gbm9kZS5sbSkgcyAtLTsKCX0KCXJldHVybiBzOwp9CgppbnQgbWFpbigpIHsKCWludCB1LCB2LCBjOwoJY2hhciBvcDsKCXNjYW5mKCIlZCAlZCIsICZuLCAmbSk7Cglmb3IgKGludCBpPTE7IGk8PW47IGkrKykgc2NhbmYoIiVkIiwgJmFbaV0pOwoJZm9yIChpbnQgaT0wOyBpPG4tMTsgaSsrKSB7CgkJc2NhbmYoIiVkICVkIiwgJnUsICZ2KTsKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOwoJCWFkalt2XS5wdXNoX2JhY2sodSk7Cgl9CglkZnMxKDEsIC0xKTsKCXRvcFsxXSA9IGZhWzFdID0gMTsKCWRmczIoMSwgLTEpOwoJYnVpbGQoMSwgMSwgbik7Cgl3aGlsZSAobSAtLSkgewoJCXNjYW5mKCIgJWMiLCAmb3ApOwoJCWlmIChvcCA9PSAnQycpIHsKCQkJc2NhbmYoIiVkICVkICVkIiwgJnUsICZ2LCAmYyk7CgkJCXVwZGF0ZSh1LCB2LCBjKTsKCQl9CgkJZWxzZSB7CgkJCXNjYW5mKCIlZCAlZCIsICZ1LCAmdik7CgkJCXByaW50ZigiJWRcbiIsIHF1ZXJ5KHUsIHYpKTsKCQl9Cgl9CglyZXR1cm4gMDsKfQ==