#include <bits/stdc++.h>
using namespace std;
const int MAXN = 300005 ;
int n, k, m;
int c[ MAXN] ;
vector< int > adj[ MAXN] ;
int tin[ MAXN] , tout[ MAXN] , timer = 0 ;
int parent_node[ MAXN] , depth[ MAXN] , heavy[ MAXN] , head[ MAXN] ;
set< int > color_pos[ MAXN] ; // Lưu các vị trí tin[] của mỗi màu
// Segment Tree với Lazy Propagation quản lý giá trị trên khoảng [1, n] tương ứng với thứ tự DFS
int st[ MAXN * 4 ] , lazy[ MAXN * 4 ] ;
void push( int node) {
if ( lazy[ node] ! = 0 ) {
st[ node * 2 ] + = lazy[ node] ;
lazy[ node * 2 ] + = lazy[ node] ;
st[ node * 2 + 1 ] + = lazy[ node] ;
lazy[ node * 2 + 1 ] + = lazy[ node] ;
lazy[ node] = 0 ;
}
}
void update( int node, int l, int r, int ql, int qr, int val) {
if ( ql > r || qr < l) return ;
if ( ql <= l && r <= qr) {
st[ node] + = val;
lazy[ node] + = val;
return ;
}
push( node) ;
int mid = ( l + r) / 2 ;
update( node * 2 , l, mid, ql, qr, val) ;
update( node * 2 + 1 , mid + 1 , r, ql, qr, val) ;
st[ node] = max( st[ node * 2 ] , st[ node * 2 + 1 ] ) ; // Hoặc dấu + tùy cách gộp đoạn, ở đây quản lý số màu max hoặc tổng tùy ý nhưng thực tế các khoảng tổ tiên cộng dồn
}
// Thay đổi hàm update cho chuẩn dạng cộng dồn trên đoạn
void range_add( int node, int l, int r, int ql, int qr, int val) {
if ( ql > r || qr < l) return ;
if ( ql <= l && r <= qr) {
st[ node] + = val;
lazy[ node] + = val;
return ;
}
push( node) ;
int mid = ( l + r) / 2 ;
range_add( node * 2 , l, mid, ql, qr, val) ;
range_add( node * 2 + 1 , mid + 1 , r, ql, qr, val) ;
st[ node] = st[ node * 2 ] + st[ node * 2 + 1 ] ; // Nếu dùng Segment Tree tổng (Sum Segment Tree)
}
int query_point( int node, int l, int r, int idx) {
if ( l == r) return st[ node] ;
push( node) ;
int mid = ( l + r) / 2 ;
if ( idx <= mid) return query_point( node * 2 , l, mid, idx) ;
else return query_point( node * 2 + 1 , mid + 1 , r, idx) ;
}
// Hàm tìm LCA nhanh dùng HLD
void dfs_sz( int u, int p) {
depth[ u] = depth[ p] + 1 ;
parent_node[ u] = p;
int max_sz = 0 ;
for ( int v : adj[ u] ) {
if ( v ! = p) {
dfs_sz( v, u) ;
int sz = tout[ v] - tin[ v] + 1 ;
if ( sz > max_sz) {
max_sz = sz;
heavy[ u] = v;
}
}
}
}
void dfs_hld( int u, int h) {
head[ u] = h;
tin[ u] = ++ timer;
if ( heavy[ u] ! = 0 ) {
dfs_hld( heavy[ u] , h) ;
}
for ( int v : adj[ u] ) {
if ( v ! = parent_node[ u] && v ! = heavy[ u] ) {
dfs_hld( v, v) ;
}
}
tout[ u] = timer;
}
int get_lca( int u, int v) {
while ( head[ u] ! = head[ v] ) {
if ( depth[ head[ u] ] > depth[ head[ v] ] ) u = parent_node[ head[ u] ] ;
else v = parent_node[ head[ v] ] ;
}
return depth[ u] < depth[ v] ? u : v;
}
// Kiểm tra quan hệ tổ tiên
bool is_ancestor( int u, int v) {
return tin[ u] <= tin[ v] && tout[ v] <= tout[ u] ;
}
// Khởi tạo ban đầu số màu phân biệt cho cây con mỗi đỉnh
set< int > cur_colors[ MAXN] ;
void dfs_init( int u, int p) {
cur_colors[ u] .insert ( c[ u] ) ;
for ( int v : adj[ u] ) {
if ( v ! = p) {
dfs_init( v, u) ;
if ( cur_colors[ v] .size ( ) > cur_colors[ u] .size ( ) ) {
swap( cur_colors[ u] , cur_colors[ v] ) ;
}
for ( int col : cur_colors[ v] ) {
cur_colors[ u] .insert ( col) ;
}
set< int > ( ) .swap ( cur_colors[ v] ) ;
}
}
}
// Cập nhật khi thêm một đỉnh u có màu col vào cấu trúc quản lý
void add_color( int u, int col) {
// Thêm vào set quản lý vị trí tin
auto it = color_pos[ col] .insert ( tin[ u] ) .first ;
// Xác định các điểm ảnh hưởng trên đường đi từ u lên gốc
// Thực chất mỗi màu mới xuất hiện trong cây con của các tổ tiên nằm từ u lên đến LCA hoặc đỉnh chặn gần nhất.
}
int main( ) {
ios_base:: sync_with_stdio ( false ) ;
cin .tie ( NULL ) ;
if ( ! ( cin >> n >> k >> m) ) return 0 ;
for ( int i = 1 ; i <= n; ++ i) {
cin >> c[ i] ;
}
for ( int i = 0 ; i < n - 1 ; ++ i) {
int u, v;
cin >> u >> v;
adj[ u] .push_back ( v) ;
adj[ v] .push_back ( u) ;
}
dfs_sz( 1 , 0 ) ;
dfs_hld( 1 , 0 ) ;
for ( int i = 1 ; i <= n; ++ i) {
color_pos[ c[ i] ] .insert ( tin[ i] ) ;
}
dfs_init( 1 , 0 ) ;
for ( int i = 1 ; i <= n; ++ i) {
// Nạp giá trị khởi tạo vào Segment Tree (quản lý tổng hoặc điểm)
// Mỗi đỉnh i có cur_colors[i].size() màu phân biệt trong cây con
// Ta có thể dùng point update cho vị trí tin[i]
}
while ( m-- ) {
int type;
cin >> type;
if ( type == 1 ) {
int a, b;
cin >> a >> b;
// Xử lý đổi màu a từ c[a] sang b
c[ a] = b;
} else {
int a;
cin >> a;
cout << query_point( 1 , 1 , n, tin[ a] ) << "\n " ;
}
}
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYTiA9IDMwMDAwNTsKCmludCBuLCBrLCBtOwppbnQgY1tNQVhOXTsKdmVjdG9yPGludD4gYWRqW01BWE5dOwoKaW50IHRpbltNQVhOXSwgdG91dFtNQVhOXSwgdGltZXIgPSAwOwppbnQgcGFyZW50X25vZGVbTUFYTl0sIGRlcHRoW01BWE5dLCBoZWF2eVtNQVhOXSwgaGVhZFtNQVhOXTsKc2V0PGludD4gY29sb3JfcG9zW01BWE5dOyAvLyBMxrB1IGPDoWMgduG7iyB0csOtIHRpbltdIGPhu6dhIG3hu5dpIG3DoHUKCi8vIFNlZ21lbnQgVHJlZSB24bubaSBMYXp5IFByb3BhZ2F0aW9uIHF14bqjbiBsw70gZ2nDoSB0cuG7iyB0csOqbiBraG/huqNuZyBbMSwgbl0gdMawxqFuZyDhu6luZyB24bubaSB0aOG7qSB04buxIERGUwppbnQgc3RbTUFYTiAqIDRdLCBsYXp5W01BWE4gKiA0XTsKCnZvaWQgcHVzaChpbnQgbm9kZSkgewogICAgaWYgKGxhenlbbm9kZV0gIT0gMCkgewogICAgICAgIHN0W25vZGUgKiAyXSArPSBsYXp5W25vZGVdOwogICAgICAgIGxhenlbbm9kZSAqIDJdICs9IGxhenlbbm9kZV07CiAgICAgICAgc3Rbbm9kZSAqIDIgKyAxXSArPSBsYXp5W25vZGVdOwogICAgICAgIGxhenlbbm9kZSAqIDIgKyAxXSArPSBsYXp5W25vZGVdOwogICAgICAgIGxhenlbbm9kZV0gPSAwOwogICAgfQp9Cgp2b2lkIHVwZGF0ZShpbnQgbm9kZSwgaW50IGwsIGludCByLCBpbnQgcWwsIGludCBxciwgaW50IHZhbCkgewogICAgaWYgKHFsID4gciB8fCBxciA8IGwpIHJldHVybjsKICAgIGlmIChxbCA8PSBsICYmIHIgPD0gcXIpIHsKICAgICAgICBzdFtub2RlXSArPSB2YWw7CiAgICAgICAgbGF6eVtub2RlXSArPSB2YWw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcHVzaChub2RlKTsKICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKICAgIHVwZGF0ZShub2RlICogMiwgbCwgbWlkLCBxbCwgcXIsIHZhbCk7CiAgICB1cGRhdGUobm9kZSAqIDIgKyAxLCBtaWQgKyAxLCByLCBxbCwgcXIsIHZhbCk7CiAgICBzdFtub2RlXSA9IG1heChzdFtub2RlICogMl0sIHN0W25vZGUgKiAyICsgMV0pOyAvLyBIb+G6t2MgZOG6pXUgKyB0w7l5IGPDoWNoIGfhu5lwIMSRb+G6oW4sIOG7nyDEkcOieSBxdeG6o24gbMO9IHPhu5EgbcOgdSBtYXggaG/hurdjIHThu5VuZyB0w7l5IMO9IG5oxrBuZyB0aOG7sWMgdOG6vyBjw6FjIGtob+G6o25nIHThu5UgdGnDqm4gY+G7mW5nIGThu5NuCn0KCi8vIFRoYXkgxJHhu5VpIGjDoG0gdXBkYXRlIGNobyBjaHXhuqluIGThuqFuZyBj4buZbmcgZOG7k24gdHLDqm4gxJFv4bqhbgp2b2lkIHJhbmdlX2FkZChpbnQgbm9kZSwgaW50IGwsIGludCByLCBpbnQgcWwsIGludCBxciwgaW50IHZhbCkgewogICAgaWYgKHFsID4gciB8fCBxciA8IGwpIHJldHVybjsKICAgIGlmIChxbCA8PSBsICYmIHIgPD0gcXIpIHsKICAgICAgICBzdFtub2RlXSArPSB2YWw7CiAgICAgICAgbGF6eVtub2RlXSArPSB2YWw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcHVzaChub2RlKTsKICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKICAgIHJhbmdlX2FkZChub2RlICogMiwgbCwgbWlkLCBxbCwgcXIsIHZhbCk7CiAgICByYW5nZV9hZGQobm9kZSAqIDIgKyAxLCBtaWQgKyAxLCByLCBxbCwgcXIsIHZhbCk7CiAgICBzdFtub2RlXSA9IHN0W25vZGUgKiAyXSArIHN0W25vZGUgKiAyICsgMV07IC8vIE7hur91IGTDuW5nIFNlZ21lbnQgVHJlZSB04buVbmcgKFN1bSBTZWdtZW50IFRyZWUpCn0KCmludCBxdWVyeV9wb2ludChpbnQgbm9kZSwgaW50IGwsIGludCByLCBpbnQgaWR4KSB7CiAgICBpZiAobCA9PSByKSByZXR1cm4gc3Rbbm9kZV07CiAgICBwdXNoKG5vZGUpOwogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgaWYgKGlkeCA8PSBtaWQpIHJldHVybiBxdWVyeV9wb2ludChub2RlICogMiwgbCwgbWlkLCBpZHgpOwogICAgZWxzZSByZXR1cm4gcXVlcnlfcG9pbnQobm9kZSAqIDIgKyAxLCBtaWQgKyAxLCByLCBpZHgpOwp9CgovLyBIw6BtIHTDrG0gTENBIG5oYW5oIGTDuW5nIEhMRAp2b2lkIGRmc19zeihpbnQgdSwgaW50IHApIHsKICAgIGRlcHRoW3VdID0gZGVwdGhbcF0gKyAxOwogICAgcGFyZW50X25vZGVbdV0gPSBwOwogICAgaW50IG1heF9zeiA9IDA7CiAgICBmb3IgKGludCB2IDogYWRqW3VdKSB7CiAgICAgICAgaWYgKHYgIT0gcCkgewogICAgICAgICAgICBkZnNfc3oodiwgdSk7CiAgICAgICAgICAgIGludCBzeiA9IHRvdXRbdl0gLSB0aW5bdl0gKyAxOwogICAgICAgICAgICBpZiAoc3ogPiBtYXhfc3opIHsKICAgICAgICAgICAgICAgIG1heF9zeiA9IHN6OwogICAgICAgICAgICAgICAgaGVhdnlbdV0gPSB2OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIGRmc19obGQoaW50IHUsIGludCBoKSB7CiAgICBoZWFkW3VdID0gaDsKICAgIHRpblt1XSA9ICsrdGltZXI7CiAgICBpZiAoaGVhdnlbdV0gIT0gMCkgewogICAgICAgIGRmc19obGQoaGVhdnlbdV0sIGgpOwogICAgfQogICAgZm9yIChpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGlmICh2ICE9IHBhcmVudF9ub2RlW3VdICYmIHYgIT0gaGVhdnlbdV0pIHsKICAgICAgICAgICAgZGZzX2hsZCh2LCB2KTsKICAgICAgICB9CiAgICB9CiAgICB0b3V0W3VdID0gdGltZXI7Cn0KCmludCBnZXRfbGNhKGludCB1LCBpbnQgdikgewogICAgd2hpbGUgKGhlYWRbdV0gIT0gaGVhZFt2XSkgewogICAgICAgIGlmIChkZXB0aFtoZWFkW3VdXSA+IGRlcHRoW2hlYWRbdl1dKSB1ID0gcGFyZW50X25vZGVbaGVhZFt1XV07CiAgICAgICAgZWxzZSB2ID0gcGFyZW50X25vZGVbaGVhZFt2XV07CiAgICB9CiAgICByZXR1cm4gZGVwdGhbdV0gPCBkZXB0aFt2XSA/IHUgOiB2Owp9CgovLyBLaeG7g20gdHJhIHF1YW4gaOG7hyB04buVIHRpw6puCmJvb2wgaXNfYW5jZXN0b3IoaW50IHUsIGludCB2KSB7CiAgICByZXR1cm4gdGluW3VdIDw9IHRpblt2XSAmJiB0b3V0W3ZdIDw9IHRvdXRbdV07Cn0KCi8vIEto4bufaSB04bqhbyBiYW4gxJHhuqd1IHPhu5EgbcOgdSBwaMOibiBiaeG7h3QgY2hvIGPDonkgY29uIG3hu5dpIMSR4buJbmgKc2V0PGludD4gY3VyX2NvbG9yc1tNQVhOXTsKdm9pZCBkZnNfaW5pdChpbnQgdSwgaW50IHApIHsKICAgIGN1cl9jb2xvcnNbdV0uaW5zZXJ0KGNbdV0pOwogICAgZm9yIChpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGlmICh2ICE9IHApIHsKICAgICAgICAgICAgZGZzX2luaXQodiwgdSk7CiAgICAgICAgICAgIGlmIChjdXJfY29sb3JzW3ZdLnNpemUoKSA+IGN1cl9jb2xvcnNbdV0uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICBzd2FwKGN1cl9jb2xvcnNbdV0sIGN1cl9jb2xvcnNbdl0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaW50IGNvbCA6IGN1cl9jb2xvcnNbdl0pIHsKICAgICAgICAgICAgICAgIGN1cl9jb2xvcnNbdV0uaW5zZXJ0KGNvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0PGludD4oKS5zd2FwKGN1cl9jb2xvcnNbdl0pOwogICAgICAgIH0KICAgIH0KfQoKLy8gQ+G6rXAgbmjhuq10IGtoaSB0aMOqbSBt4buZdCDEkeG7iW5oIHUgY8OzIG3DoHUgY29sIHbDoG8gY+G6pXUgdHLDumMgcXXhuqNuIGzDvQp2b2lkIGFkZF9jb2xvcihpbnQgdSwgaW50IGNvbCkgewogICAgLy8gVGjDqm0gdsOgbyBzZXQgcXXhuqNuIGzDvSB24buLIHRyw60gdGluCiAgICBhdXRvIGl0ID0gY29sb3JfcG9zW2NvbF0uaW5zZXJ0KHRpblt1XSkuZmlyc3Q7CiAgICAvLyBYw6FjIMSR4buLbmggY8OhYyDEkWnhu4NtIOG6o25oIGjGsOG7n25nIHRyw6puIMSRxrDhu51uZyDEkWkgdOG7qyB1IGzDqm4gZ+G7kWMKICAgIC8vIFRo4buxYyBjaOG6pXQgbeG7l2kgbcOgdSBt4bubaSB4deG6pXQgaGnhu4duIHRyb25nIGPDonkgY29uIGPhu6dhIGPDoWMgdOG7lSB0acOqbiBu4bqxbSB04burIHUgbMOqbiDEkeG6v24gTENBIGhv4bq3YyDEkeG7iW5oIGNo4bq3biBn4bqnbiBuaOG6pXQuCn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwoKICAgIGlmICghKGNpbiA+PiBuID4+IGsgPj4gbSkpIHJldHVybiAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgY2luID4+IGNbaV07CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyArK2kpIHsKICAgICAgICBpbnQgdSwgdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh1KTsKICAgIH0KCiAgICBkZnNfc3ooMSwgMCk7CiAgICBkZnNfaGxkKDEsIDApOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewogICAgICAgIGNvbG9yX3Bvc1tjW2ldXS5pbnNlcnQodGluW2ldKTsKICAgIH0KCiAgICBkZnNfaW5pdCgxLCAwKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewogICAgICAgIC8vIE7huqFwIGdpw6EgdHLhu4sga2jhu59pIHThuqFvIHbDoG8gU2VnbWVudCBUcmVlIChxdeG6o24gbMO9IHThu5VuZyBob+G6t2MgxJFp4buDbSkKICAgICAgICAvLyBN4buXaSDEkeG7iW5oIGkgY8OzIGN1cl9jb2xvcnNbaV0uc2l6ZSgpIG3DoHUgcGjDom4gYmnhu4d0IHRyb25nIGPDonkgY29uCiAgICAgICAgLy8gVGEgY8OzIHRo4buDIGTDuW5nIHBvaW50IHVwZGF0ZSBjaG8gduG7iyB0csOtIHRpbltpXQogICAgfQoKICAgIHdoaWxlIChtLS0pIHsKICAgICAgICBpbnQgdHlwZTsKICAgICAgICBjaW4gPj4gdHlwZTsKICAgICAgICBpZiAodHlwZSA9PSAxKSB7CiAgICAgICAgICAgIGludCBhLCBiOwogICAgICAgICAgICBjaW4gPj4gYSA+PiBiOwogICAgICAgICAgICAvLyBY4butIGzDvSDEkeG7lWkgbcOgdSBhIHThu6sgY1thXSBzYW5nIGIKICAgICAgICAgICAgY1thXSA9IGI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IGE7CiAgICAgICAgICAgIGNpbiA+PiBhOwogICAgICAgICAgICBjb3V0IDw8IHF1ZXJ5X3BvaW50KDEsIDEsIG4sIHRpblthXSkgPDwgIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=