int tol,head[maxn];
struct edge
{
int to,next;
}es[maxm];
void addedge( int u , int v )
{
es[tol].to = v;
es[tol].next = head[u];
head[u] = tol++;
}
int top[maxn],fa[maxn],dep[maxn],sizes[maxn],tid[maxn],rk[maxn],wson[maxn],num;
void init()
{
tol = 0;
memset ( head , -1 , sizeof(head) );
num = 0;
memset ( wson , -1 , sizeof(wson) );
}
void dfs1( int u , int f , int d )
{
dep[u] = d,fa[u] = f,sizes[u] = 1;
for ( int i=head[u] ; i!=-1 ; i=es[i].next )
{
int v = es[i].to;
if ( v!=f )
{
dfs1 ( v , u , d+1 );
sizes[u] += sizes[v];
if ( wson[u]==-1||sizes[v]>sizes[wson[u]] )
wson[u] = v;
}
}
}
void dfs2( int u , int tp )
{
top[u] = tp,tid[u] = ++num,rk[tid[u]] = u;
if ( wson[u]==-1 ) return;
dfs2( wson[u] , tp );
for ( int i=head[u] ; i!=-1 ; i=es[i].next )
if ( es[i].to!=fa[u]&&es[i].to!=wson[u] ) dfs2( es[i].to , es[i].to );
}
dfs1( 1 , 0 , 1 );
dfs2( 1 , 1 );
for ( int i=2 ; i<=n ; i++ )
{
if ( dep[u[i]]<dep[v[i]] ) swap ( u[i] , v[i] );
val[u[i]] = w[i];
}
void Change( int u , int v )
{
while ( top[u]!=top[v] )
{
if ( dep[top[u]]<dep[top[v]] ) swap ( u , v );
Update( tid[top[u]] , tid[u] , 2 , n , 1 );
u = fa[top[u]];
}
if ( dep[u]>dep[v] ) swap ( u , v );
Update( tid[u]+1 , tid[v] , 2 , n , 1 );
}