Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include<stdio.h>
- #include<iostream>
- #include<vector>
- #include<cmath>
- #include<algorithm>
- #include<memory.h>
- #include<map>
- #include<set>
- #include<queue>
- #include<list>
- #include<sstream>
- #include<cstring>
- #include<numeric>
- using namespace std;
- const int N = 4e5;
- vector<int> g[N];
- int a[N];
- long long ans[N];
- int pushing[N];
- int p[N];
- int root = -1;
- bool u[N];
- int bitCount(long long a) {
- int res = 0;
- while (a > 0) {
- if (a % 2 != 0) {
- res++;
- }
- a >>= 1;
- }
- return res;
- }
- int query(int v){
- return bitCount(ans[v]);
- }
- void upd(int v, int c) {
- ans[v] = 1 << c;
- while (p[v] != -1) {
- v = p[v];
- ans[v] = 0;
- for (auto to : g[v]) {
- ans[v] |= ans[to];
- }
- }
- }
- void build(int v) {
- u[v] = true;
- ans[v] = 1 << a[v];
- for (auto to : g[v]) {
- if (!u[to]) {
- p[to] = v;
- build(to);
- ans[v] |= ans[to];
- }
- }
- }
- void addEdge(int a, int b) {
- g[a].push_back(b);
- g[b].push_back(a);
- }
- int main() {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- #endif
- int n, m;
- scanf("%d%d", &n, &m);
- for (int i = 0; i < n; i++) {
- scanf("%d", &a[i]);
- }
- fill_n(p, N, -1);
- for (int i = 0; i < n - 1; i++) {
- int a, b;
- scanf("%d%d", &a, &b);
- if (root == -1) {
- root = a - 1;
- }
- addEdge(a - 1, b - 1);
- }
- build(root);
- for (int i = 0; i < m; i++) {
- int t;
- scanf("%d", &t);
- if (t == 1) {
- int v, c;
- scanf("%d%d", &v, &c);
- upd(v - 1, c);
- }
- else {
- int v;
- scanf("%d", &v);
- printf("%d\n", query(v - 1));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement