[Cpp]
# Include <iostream>
# Include <cstdio>
# Include <vector>
Using namespace std;
Const int n= 55009;
Int n, q, a, B, fa [N], vis [N], ans [N], v [N], Max [N], Min [N], up [N], down [N];
Vector <int> need [N], edge [N], kv [N];
Int find (int x)
{
If (x = fa [x]) return x;
Int y = fa [x];
Fa [x] = find (fa [x]);
Up [x] = max (Max [y]-Min [x], max (up [x], up [y]);
Down [x] = max (Max [x]-Min [y], max (down [x], down [y]);
Max [x] = max (Max [y], Max [x]);
Min [x] = min (Min [y], Min [x]);
Return fa [x];
}
Void tarjan (int x)
{
Vis [x] = 1;
For (int I = 0; I <need [x]. size (); I = I + 2)
{
Int y = need [x] [I];
If (vis [y])
{
Int t = find (y), f = need [x] [I + 1];
If (f> 0)
{
Kv [t]. push_back (x );
Kv [t]. push_back (y );
}
Else
{
Kv [t]. push_back (y );
Kv [t]. push_back (x );
}
Kv [t]. push_back (f> 0? F:-f );
}
}
For (int I = 0; I <edge [x]. size (); I ++)
{
Int y = edge [x] [I];
If (! Vis [y])
{
Tarjan (y );
Fa [y] = x;
}
}
For (int I = 0; I <kv [x]. size (); I = I + 3)
{
Int a = kv [x] [I], B = kv [x] [I + 1], f = kv [x] [I + 2];
Find (a); find (B );
Ans [f] = max (up [a], max (down [B], Max [B]-Min [a]);
}
}
Void init ()
{
For (int I = 0; I <= n; I ++)
{
Fa [I] = I;
Vis [I] = 0;
Need [I]. clear ();
Edge [I]. clear ();
Kv [I]. clear ();
}
For (int I = 1; I <= n; I ++)
{
Scanf ("% d", & v [I]);
Max [I] = v [I];
Min [I] = v [I];
Up [I] = 0;
Down [I] = 0;
}
For (int I = 0; I <n-1; I ++)
{
Scanf ("% d", & a, & B );
Edge [a]. push_back (B );
Edge [B]. push_back ();
}
Scanf ("% d", & q );
For (int I = 1; I <= q; I ++)
{
Scanf ("% d", & a, & B );
Need [a]. push_back (B );
Need [a]. push_back (I );
Need [B]. push_back ();
Need [B]. push_back (-I );
}
Tarjan (1); www.2cto.com
For (int I = 1; I <= q; I ++)
{
Printf ("% d \ n", ans [I]);
}
}
Int main ()
{
While (scanf ("% d", & n )! = EOF)
{
Init ();
}
}
Author: wsniyufang