# include <cstdio>
# include <cstring>
# include <set>
using namespace std;
const int N = 50010 , M = 100010 ;
int l[ N] , r[ N] , cnt;
int h[ N] , e[ M] , ne[ M] , idx;
struct Node
{
int l, r, v;
bool flag;
} tr[ N<< 2 ] ;
void add ( int a, int b)
{
e[ idx] = b, ne[ idx] = h[ a] , h[ a] = idx++ ;
}
void dfs ( int u, int fa)
{
l[ u] = ++ cnt;
for ( int i= h[ u] ; ~ i; i= ne[ i] )
{
if ( e[ i] == fa) continue ;
dfs ( e[ i] , u) ;
}
r[ u] = cnt;
}
void pushdown ( int u)
{
if ( ! tr[ u] . flag) return ;
tr[ u<< 1 ] . v= tr[ u<< 1 | 1 ] . v= tr[ u] . v;
tr[ u<< 1 ] . flag= tr[ u<< 1 | 1 ] . flag= true ;
tr[ u] . flag= false ;
}
void build ( int u, int l, int r)
{
if ( l== r) tr[ u] = ( Node) { l, r, - 1 , 0 } ;
else
{
tr[ u] = ( Node) { l, r, - 1 , 0 } ;
int mid= ( l+ r) >> 1 ;
build ( u<< 1 , l, mid) ;
build ( u<< 1 | 1 , mid+ 1 , r) ;
}
}
void modify ( int u, int l, int r, int v)
{
if ( tr[ u] . l>= l&& tr[ u] . r<= r)
{
tr[ u] . v= v;
tr[ u] . flag= 1 ;
}
else
{
pushdown ( u) ;
int mid= ( tr[ u] . l+ tr[ u] . r) >> 1 ;
if ( l<= mid) modify ( u<< 1 , l, r, v) ;
if ( r> mid) modify ( u<< 1 | 1 , l, r, v) ;
}
}
int query ( int u, int x)
{
if ( tr[ u] . flag|| tr[ u] . l== tr[ u] . r) return tr[ u] . v;
else
{
int mid= ( tr[ u] . l+ tr[ u] . r) >> 1 ;
if ( x<= mid) return query ( u<< 1 , x) ;
if ( x> mid) return query ( u<< 1 | 1 , x) ;
}
}
int main ( )
{
int T; scanf ( "%d" , & T) ;
for ( int C= 1 ; C<= T; C++ )
{
printf ( "Case #%d:\n" , C) ;
cnt = idx = 0 ;
memset ( h, - 1 , sizeof h) ;
set< int > root;
int n; scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ ) root. insert ( i) ;
for ( int i= 1 ; i<= n- 1 ; i++ )
{
int a, b; scanf ( "%d%d" , & a, & b) ;
add ( a, b) , add ( b, a) ;
root. erase ( a) ;
}
dfs ( * root. begin ( ) , - 1 ) ;
build ( 1 , 1 , n) ;
int m; scanf ( "%d" , & m) ;
while ( m-- )
{
char op[ 2 ] ; scanf ( "%s" , op) ;
if ( * op== 'C' )
{
int x; scanf ( "%d" , & x) ;
printf ( "%d\n" , query ( 1 , l[ x] ) ) ;
}
else
{
int x, v; scanf ( "%d%d" , & x, & v) ;
modify ( 1 , l[ x] , r[ x] , v) ;
}
}
}
return 0 ;
}
v
e
c
c
t
o
r
vecctor
v e c c t o r 建图,常数略大一点
# include <cstdio>
# include <cstring>
# include <vector>
# include <set>
using namespace std;
const int N = 50010 , M = 100010 ;
int l[ N] , r[ N] , cnt;
vector< int > g[ N] ;
struct Node
{
int l, r, v;
bool flag;
} tr[ N<< 2 ] ;
void dfs ( int u, int fa)
{
l[ u] = ++ cnt;
for ( auto & ei: g[ u] )
{
if ( ei== fa) continue ;
dfs ( ei, u) ;
}
r[ u] = cnt;
}
void pushdown ( int u)
{
if ( ! tr[ u] . flag) return ;
tr[ u<< 1 ] . v= tr[ u<< 1 | 1 ] . v= tr[ u] . v;
tr[ u<< 1 ] . flag= tr[ u<< 1 | 1 ] . flag= true ;
tr[ u] . flag= false ;
}
void build ( int u, int l, int r)
{
if ( l== r) tr[ u] = ( Node) { l, r, - 1 , 0 } ;
else
{
tr[ u] = ( Node) { l, r, - 1 , 0 } ;
int mid= ( l+ r) >> 1 ;
build ( u<< 1 , l, mid) ;
build ( u<< 1 | 1 , mid+ 1 , r) ;
}
}
void modify ( int u, int l, int r, int v)
{
if ( tr[ u] . l>= l&& tr[ u] . r<= r)
{
tr[ u] . v= v;
tr[ u] . flag= 1 ;
return ;
}
else
{
pushdown ( u) ;
int mid= ( tr[ u] . l+ tr[ u] . r) >> 1 ;
if ( l<= mid) modify ( u<< 1 , l, r, v) ;
if ( r> mid) modify ( u<< 1 | 1 , l, r, v) ;
}
}
int query ( int u, int x)
{
if ( tr[ u] . flag|| tr[ u] . l== tr[ u] . r) return tr[ u] . v;
else
{
int mid= ( tr[ u] . l+ tr[ u] . r) >> 1 ;
if ( x<= mid) return query ( u<< 1 , x) ;
if ( x> mid) return query ( u<< 1 | 1 , x) ;
}
return - 1 ;
}
int main ( )
{
int T; scanf ( "%d" , & T) ;
for ( int C= 1 ; C<= T; C++ )
{
printf ( "Case #%d:\n" , C) ;
cnt= 0 ;
set< int > root;
int n; scanf ( "%d" , & n) ;
for ( int i= 1 ; i<= n; i++ ) g[ i] . clear ( ) ;
for ( int i= 1 ; i<= n; i++ ) root. insert ( i) ;
for ( int i= 1 ; i<= n- 1 ; i++ )
{
int a, b; scanf ( "%d%d" , & a, & b) ;
g[ a] . push_back ( b) ;
g[ b] . push_back ( a) ;
root. erase ( a) ;
}
dfs ( * root. begin ( ) , - 1 ) ;
build ( 1 , 1 , n) ;
int m; scanf ( "%d" , & m) ;
while ( m-- )
{
char op[ 2 ] ; scanf ( "%s" , op) ;
if ( * op== 'C' )
{
int x; scanf ( "%d" , & x) ;
printf ( "%d\n" , query ( 1 , l[ x] ) ) ;
}
else
{
int x, v; scanf ( "%d%d" , & x, & v) ;
modify ( 1 , l[ x] , r[ x] , v) ;
}
}
}
return 0 ;
}