#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include < Algorithm> #include <cmath>using namespace std;const int maxn = 100000 + 5;int N, M, Index;int A[MAXN], POS[MAXN], COL[MAXN], SON[MAXN], FATHER[MAXN], TOP[MAXN], SIZE[MAXN], Depth[maxn];int V[MAXN * 4], LNUM[MAXN * 4], RNUM[MAXN * 4];st ruct Edge {int v; Edge *next;} E[MAXN * 2], *p = E, *point[maxn];inline void Addedge (int x, int y) {++p; P-v = y; P-Next = point[x]; POINT[X] = P;} int dfs_1 (int x, int Fa, int Dep) {father[x] = Fa; DEPTH[X] = DEP; SIZE[X] = 1;int maxsonsize, sonsize; Maxsonsize = 0;for (Edge *j = point[x]; j; j = J-Next) {if (J-v = = Fa) continue; Sonsize = DFS (J-V, X, Dep + 1); SIZE[X] + = sonsize;if (Sonsize > Maxsonsize) {son[x] = J-V; Maxsonsize = Sonsize;}} return size[x];} void dfs_2 (int x) {if (x = = Son[father[x]]) top[x] = Top[father[x]];else top[x] = x; POS[X] = ++index; A[POS[X]] = col[x];D fs_2 (son[x]); for (Edge *j = PoiNT[X]; J j = J-Next) {if (J-v = = Father[x] | | J-v = son[x]) continue;dfs_2 (J-v);} inline void Update (int x) {V[x] = v[x << 1] + v[x << 1 | 1]; LNUM[X] = lnum[x << 1]; RNUM[X] = rnum[x << 1 | 1];if (rnum[x << 1] = = lnum[x << 1 | 1])--V[X];} void Buildtree (int x, int s, int t) {if (s = = t) {lnum[x] = a[x]; RNUM[X] = a[x]; V[X] = 1;return;} int m = (s + t) >> 1; Buildtree (x << 1, S, m); Buildtree (x << 1 | 1, M + 1, t); Update (x);} int main () {scanf ("%d%d", &n, &m), for (int i = 1; I <= n; ++i) scanf ("%d", &col[i]); for (int i = 1; I <= n-1; ++i) {scanf ("%d%d", &a, &b); Addedge (A, b); Addedge (b, a);} Index = 0;dfs_1 (1, 0, 0);D fs_2 (1); Buildtree (1, 1, n); char ch;for (int i = 1; I <= m; ++i) {ch = ' 0 '; while (ch! = ' C ' && ch = = ' Q ') ch = getchar () ; scanf ("%d%d%d", &a, &b, &c);} return 0;}
.. 2243