#include<bits/stdc++.h>
using namespace std;
const int ROOT = 0;
int VAL[250007];
int subtreesize[250007];
vector<vector<int>> GRAF(250007);
vector<int> UPEDGE(250007);
vector<bool> UPHEAVY(250007);
vector<bool> HASDOWN(250007);
vector<int> HEAVYSTART;
vector<vector<int>> HEAVYPATHS;
vector<pair<int, int>> HEAVYPATH(250007);
int preorder[250007];
int postorder[250007];
int jump[250007][20];
const int base = (1<<18);
int MAXSEGMENTTREE[2*base+7];
int MINSEGMENTTREE[2*base+7];
int prelicz = 0;
void USTAW(int A, int K){
A+=base;
MAXSEGMENTTREE[A]=K;
MINSEGMENTTREE[A]=K;
A/=2;
while(A != 0){
MAXSEGMENTTREE[A]=max(MAXSEGMENTTREE[A*2], MAXSEGMENTTREE[A*2+1]);
MINSEGMENTTREE[A]=min(MINSEGMENTTREE[A*2], MINSEGMENTTREE[A*2+1]);
A/=2;
}
}
int MAXONINTERVAL(int A, int B){
A--;
B++;
A+=base;
B+=base;
int wyn = -1e9-6;
while(A/2 != B/2){
if(A%2 == 0){
wyn = max(wyn, MAXSEGMENTTREE[A+1]);
}
if(B%2 == 1){
wyn = max(wyn, MAXSEGMENTTREE[B-1]);
}
A/=2;
B/=2;
}
return wyn;
}
int MINONINTERVAL(int A, int B){
A--;
B++;
A+=base;
B+=base;
int wyn = 1e9+6;
while(A/2 != B/2){
if(A%2 == 0){
wyn = min(wyn, MINSEGMENTTREE[A+1]);
}
if(B%2 == 1){
wyn = min(wyn, MINSEGMENTTREE[B-1]);
}
A/=2;
B/=2;
}
return wyn;
}
int licz = 1;
int DFS(int NODE, pair<int, bool> prevedge){
preorder[NODE]=prelicz;
prelicz++;
jump[NODE][0]=prevedge.first;
UPEDGE[NODE]=prevedge.first;
UPHEAVY[NODE]=prevedge.second;
int SIZE = 0;
for(auto i : GRAF[NODE]){
if(i != UPEDGE[NODE]){
SIZE+=DFS(i, {NODE, 0});
}
}
SIZE++;
subtreesize[NODE]=SIZE;
for(auto i : GRAF[NODE]){
if(i != UPEDGE[NODE]){
if(subtreesize[i] >= (SIZE+1)/2){
UPHEAVY[i]=true;
HASDOWN[NODE]=true;
}
}
}
if(!HASDOWN[NODE]){
HEAVYSTART.push_back(NODE);
}
postorder[NODE]=prelicz;
prelicz++;
return SIZE;
}
bool insubtree(int A, int B){
if(preorder[A] <= preorder[B] && postorder[A] >= postorder[B])return true;
return false;
}
int LCA(int A, int B){
if(insubtree(A, B)){
return A;
}
else if(insubtree(B, A)){
return B;
}
for(int i = 19; i >= 0; --i){
if(!insubtree(jump[A][i], B)){
A = jump[A][i];
}
}
return jump[A][0];
}
int MAXOFPATH(int A, int GOAL){
// cerr << "Calculating MAX on path: " << A << " " << GOAL << "\n";
if(HEAVYPATH[A].first == HEAVYPATH[GOAL].first){
// cerr << "ON SAME HEAVY PATH, returning " << MAXONINTERVAL(HEAVYPATH[A].second, HEAVYPATH[GOAL].second) << "\n";
return MAXONINTERVAL(HEAVYPATH[A].second, HEAVYPATH[GOAL].second);
}
int LAST = HEAVYPATHS[HEAVYPATH[A].first].back();
// cerr << "NOT ON SAME HEAVY PATH, returning MAXOF " << MAXONINTERVAL(HEAVYPATH[A].second, HEAVYPATH[LAST].second) << " and " << jump[LAST][0] << " " << GOAL << "\n";
return max(MAXONINTERVAL(HEAVYPATH[A].second, HEAVYPATH[LAST].second), MAXOFPATH(jump[LAST][0], GOAL));
}
int MINOFPATH(int A, int GOAL){
if(HEAVYPATH[A].first == HEAVYPATH[GOAL].first){
return MINONINTERVAL(HEAVYPATH[A].second, HEAVYPATH[GOAL].second);
}
int LAST = HEAVYPATHS[HEAVYPATH[A].first].back();
return min(MINONINTERVAL(HEAVYPATH[A].second, HEAVYPATH[LAST].second), MINOFPATH(jump[LAST][0], GOAL));
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
int N, Q; cin >> N >> Q;
for(int i = 0; i < 2*base+7; ++i){
MAXSEGMENTTREE[i]=-1e9-6;
MINSEGMENTTREE[i]=1e9+6;
}
for(int i = 0; i < N; ++i){
cin >> VAL[i];
}
for(int i = 0; i < N-1; ++i){
int a, b; cin >> a >> b;
GRAF[a].push_back(b);
GRAF[b].push_back(a);
}
DFS(0, {-1, 0});
for(int i : HEAVYSTART){
HEAVYPATHS.push_back({i});
HEAVYPATH[i]={HEAVYPATHS.size()-1, licz};
licz++;
int idx = i;
USTAW(licz-1, VAL[idx]);
while(UPHEAVY[idx] == 1){
idx = UPEDGE[idx];
HEAVYPATHS[HEAVYPATHS.size()-1].push_back({idx});
HEAVYPATH[idx]={HEAVYPATHS.size()-1, licz};
USTAW(licz, VAL[idx]);
licz++;
}
}
jump[0][0]=0;
for(int i = 1; i <= N; ++i){
for(int j = 1; j < 20; ++j){
jump[i][j]=jump[jump[i][j-1]][j-1];
}
}
while(Q--){
int A, B; cin >> A >> B;
int lca = LCA(A, B);
cout << max(MAXOFPATH(A, lca), MAXOFPATH(B, lca))-min(MINOFPATH(B, lca), MINOFPATH(A, lca)) << "\n";
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBST09UID0gMDsKaW50IFZBTFsyNTAwMDddOwppbnQgc3VidHJlZXNpemVbMjUwMDA3XTsKdmVjdG9yPHZlY3RvcjxpbnQ+PiBHUkFGKDI1MDAwNyk7CnZlY3RvcjxpbnQ+IFVQRURHRSgyNTAwMDcpOwp2ZWN0b3I8Ym9vbD4gVVBIRUFWWSgyNTAwMDcpOwp2ZWN0b3I8Ym9vbD4gSEFTRE9XTigyNTAwMDcpOwp2ZWN0b3I8aW50PiBIRUFWWVNUQVJUOwp2ZWN0b3I8dmVjdG9yPGludD4+IEhFQVZZUEFUSFM7CnZlY3RvcjxwYWlyPGludCwgaW50Pj4gSEVBVllQQVRIKDI1MDAwNyk7CmludCBwcmVvcmRlclsyNTAwMDddOwppbnQgcG9zdG9yZGVyWzI1MDAwN107CmludCBqdW1wWzI1MDAwN11bMjBdOwpjb25zdCBpbnQgYmFzZSA9ICgxPDwxOCk7CmludCBNQVhTRUdNRU5UVFJFRVsyKmJhc2UrN107CmludCBNSU5TRUdNRU5UVFJFRVsyKmJhc2UrN107CmludCBwcmVsaWN6ID0gMDsKCnZvaWQgVVNUQVcoaW50IEEsIGludCBLKXsKICAgIEErPWJhc2U7CiAgICBNQVhTRUdNRU5UVFJFRVtBXT1LOwogICAgTUlOU0VHTUVOVFRSRUVbQV09SzsKICAgIEEvPTI7CiAgICB3aGlsZShBICE9IDApewogICAgICAgIE1BWFNFR01FTlRUUkVFW0FdPW1heChNQVhTRUdNRU5UVFJFRVtBKjJdLCBNQVhTRUdNRU5UVFJFRVtBKjIrMV0pOwogICAgICAgIE1JTlNFR01FTlRUUkVFW0FdPW1pbihNSU5TRUdNRU5UVFJFRVtBKjJdLCBNSU5TRUdNRU5UVFJFRVtBKjIrMV0pOwogICAgICAgIEEvPTI7CiAgICB9Cn0KaW50IE1BWE9OSU5URVJWQUwoaW50IEEsIGludCBCKXsKICAgIEEtLTsKICAgIEIrKzsKICAgIEErPWJhc2U7CiAgICBCKz1iYXNlOwogICAgaW50IHd5biA9IC0xZTktNjsKICAgIHdoaWxlKEEvMiAhPSBCLzIpewogICAgICAgIGlmKEElMiA9PSAwKXsKICAgICAgICAgICAgd3luID0gbWF4KHd5biwgTUFYU0VHTUVOVFRSRUVbQSsxXSk7CiAgICAgICAgfQogICAgICAgIGlmKEIlMiA9PSAxKXsKICAgICAgICAgICAgd3luID0gbWF4KHd5biwgTUFYU0VHTUVOVFRSRUVbQi0xXSk7CiAgICAgICAgfQogICAgICAgIEEvPTI7CiAgICAgICAgQi89MjsKICAgIH0KICAgIHJldHVybiB3eW47Cn0KaW50IE1JTk9OSU5URVJWQUwoaW50IEEsIGludCBCKXsKICAgIEEtLTsKICAgIEIrKzsKICAgIEErPWJhc2U7CiAgICBCKz1iYXNlOwogICAgaW50IHd5biA9IDFlOSs2OwogICAgd2hpbGUoQS8yICE9IEIvMil7CiAgICAgICAgaWYoQSUyID09IDApewogICAgICAgICAgICB3eW4gPSBtaW4od3luLCBNSU5TRUdNRU5UVFJFRVtBKzFdKTsKICAgICAgICB9CiAgICAgICAgaWYoQiUyID09IDEpewogICAgICAgICAgICB3eW4gPSBtaW4od3luLCBNSU5TRUdNRU5UVFJFRVtCLTFdKTsKICAgICAgICB9CiAgICAgICAgQS89MjsKICAgICAgICBCLz0yOwogICAgfQogICAgcmV0dXJuIHd5bjsKfQoKCmludCBsaWN6ID0gMTsKaW50IERGUyhpbnQgTk9ERSwgcGFpcjxpbnQsIGJvb2w+IHByZXZlZGdlKXsKICAgIHByZW9yZGVyW05PREVdPXByZWxpY3o7CiAgICBwcmVsaWN6Kys7CiAgICBqdW1wW05PREVdWzBdPXByZXZlZGdlLmZpcnN0OwogICAgVVBFREdFW05PREVdPXByZXZlZGdlLmZpcnN0OwogICAgVVBIRUFWWVtOT0RFXT1wcmV2ZWRnZS5zZWNvbmQ7CiAgICBpbnQgU0laRSA9IDA7CiAgICBmb3IoYXV0byBpIDogR1JBRltOT0RFXSl7CiAgICAgICAgaWYoaSAhPSBVUEVER0VbTk9ERV0pewogICAgICAgICAgICBTSVpFKz1ERlMoaSwge05PREUsIDB9KTsKICAgICAgICB9CiAgICB9CiAgICBTSVpFKys7CiAgICBzdWJ0cmVlc2l6ZVtOT0RFXT1TSVpFOwogICAgZm9yKGF1dG8gaSA6IEdSQUZbTk9ERV0pewogICAgICAgIGlmKGkgIT0gVVBFREdFW05PREVdKXsKICAgICAgICAgICAgaWYoc3VidHJlZXNpemVbaV0gPj0gKFNJWkUrMSkvMil7CiAgICAgICAgICAgICAgICBVUEhFQVZZW2ldPXRydWU7CiAgICAgICAgICAgICAgICBIQVNET1dOW05PREVdPXRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZighSEFTRE9XTltOT0RFXSl7CiAgICAgICAgSEVBVllTVEFSVC5wdXNoX2JhY2soTk9ERSk7CiAgICB9CiAgICBwb3N0b3JkZXJbTk9ERV09cHJlbGljejsKICAgIHByZWxpY3orKzsKICAgIHJldHVybiBTSVpFOwp9Cgpib29sIGluc3VidHJlZShpbnQgQSwgaW50IEIpewogICAgaWYocHJlb3JkZXJbQV0gPD0gcHJlb3JkZXJbQl0gJiYgcG9zdG9yZGVyW0FdID49IHBvc3RvcmRlcltCXSlyZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKfQppbnQgTENBKGludCBBLCBpbnQgQil7CiAgICBpZihpbnN1YnRyZWUoQSwgQikpewogICAgICAgIHJldHVybiBBOwogICAgfQogICAgZWxzZSBpZihpbnN1YnRyZWUoQiwgQSkpewogICAgICAgIHJldHVybiBCOwogICAgfQogICAgZm9yKGludCBpID0gMTk7IGkgPj0gMDsgLS1pKXsKICAgICAgICBpZighaW5zdWJ0cmVlKGp1bXBbQV1baV0sIEIpKXsKICAgICAgICAgICAgQSA9IGp1bXBbQV1baV07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGp1bXBbQV1bMF07Cn0KCmludCBNQVhPRlBBVEgoaW50IEEsIGludCBHT0FMKXsKICAgLy8gY2VyciA8PCAiQ2FsY3VsYXRpbmcgTUFYIG9uIHBhdGg6ICIgPDwgQSA8PCAiICIgPDwgR09BTCA8PCAiXG4iOwogICAgaWYoSEVBVllQQVRIW0FdLmZpcnN0ID09IEhFQVZZUEFUSFtHT0FMXS5maXJzdCl7CiAgICAgICAvLyBjZXJyIDw8ICJPTiBTQU1FIEhFQVZZIFBBVEgsIHJldHVybmluZyAiIDw8IE1BWE9OSU5URVJWQUwoSEVBVllQQVRIW0FdLnNlY29uZCwgSEVBVllQQVRIW0dPQUxdLnNlY29uZCkgPDwgIlxuIjsKICAgICAgICByZXR1cm4gTUFYT05JTlRFUlZBTChIRUFWWVBBVEhbQV0uc2Vjb25kLCBIRUFWWVBBVEhbR09BTF0uc2Vjb25kKTsKICAgIH0KICAgIGludCBMQVNUID0gSEVBVllQQVRIU1tIRUFWWVBBVEhbQV0uZmlyc3RdLmJhY2soKTsKICAgLy8gY2VyciA8PCAiTk9UIE9OIFNBTUUgSEVBVlkgUEFUSCwgcmV0dXJuaW5nIE1BWE9GICIgPDwgTUFYT05JTlRFUlZBTChIRUFWWVBBVEhbQV0uc2Vjb25kLCBIRUFWWVBBVEhbTEFTVF0uc2Vjb25kKSA8PCAiIGFuZCAiIDw8IGp1bXBbTEFTVF1bMF0gPDwgIiAiIDw8IEdPQUwgPDwgIlxuIjsKICAgIHJldHVybiBtYXgoTUFYT05JTlRFUlZBTChIRUFWWVBBVEhbQV0uc2Vjb25kLCBIRUFWWVBBVEhbTEFTVF0uc2Vjb25kKSwgTUFYT0ZQQVRIKGp1bXBbTEFTVF1bMF0sIEdPQUwpKTsKfQoKaW50IE1JTk9GUEFUSChpbnQgQSwgaW50IEdPQUwpewogICAgaWYoSEVBVllQQVRIW0FdLmZpcnN0ID09IEhFQVZZUEFUSFtHT0FMXS5maXJzdCl7CiAgICAgICAgcmV0dXJuIE1JTk9OSU5URVJWQUwoSEVBVllQQVRIW0FdLnNlY29uZCwgSEVBVllQQVRIW0dPQUxdLnNlY29uZCk7CiAgICB9CiAgICBpbnQgTEFTVCA9IEhFQVZZUEFUSFNbSEVBVllQQVRIW0FdLmZpcnN0XS5iYWNrKCk7CiAgICByZXR1cm4gbWluKE1JTk9OSU5URVJWQUwoSEVBVllQQVRIW0FdLnNlY29uZCwgSEVBVllQQVRIW0xBU1RdLnNlY29uZCksIE1JTk9GUEFUSChqdW1wW0xBU1RdWzBdLCBHT0FMKSk7Cn0KaW50IG1haW4oKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7CiAgICBpbnQgTiwgUTsgY2luID4+IE4gPj4gUTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyKmJhc2UrNzsgKytpKXsgICAKICAgICAgICBNQVhTRUdNRU5UVFJFRVtpXT0tMWU5LTY7CiAgICAgICAgTUlOU0VHTUVOVFRSRUVbaV09MWU5KzY7CiAgICB9CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgTjsgKytpKXsKICAgICAgICBjaW4gPj4gVkFMW2ldOwogICAgfQogICAgZm9yKGludCBpID0gMDsgaSA8IE4tMTsgKytpKXsgICAKICAgICAgICBpbnQgYSwgYjsgY2luID4+IGEgPj4gYjsKICAgICAgICBHUkFGW2FdLnB1c2hfYmFjayhiKTsKICAgICAgICBHUkFGW2JdLnB1c2hfYmFjayhhKTsKICAgIH0KICAgIERGUygwLCB7LTEsIDB9KTsKICAgIGZvcihpbnQgaSA6IEhFQVZZU1RBUlQpewogICAgICAgIEhFQVZZUEFUSFMucHVzaF9iYWNrKHtpfSk7CiAgICAgICAgSEVBVllQQVRIW2ldPXtIRUFWWVBBVEhTLnNpemUoKS0xLCBsaWN6fTsKICAgICAgICBsaWN6Kys7CiAgICAgICAgaW50IGlkeCA9IGk7CiAgICAgICAgVVNUQVcobGljei0xLCBWQUxbaWR4XSk7CiAgICAgICAgd2hpbGUoVVBIRUFWWVtpZHhdID09IDEpewogICAgICAgICAgICBpZHggPSBVUEVER0VbaWR4XTsKICAgICAgICAgICAgSEVBVllQQVRIU1tIRUFWWVBBVEhTLnNpemUoKS0xXS5wdXNoX2JhY2soe2lkeH0pOwogICAgICAgICAgICBIRUFWWVBBVEhbaWR4XT17SEVBVllQQVRIUy5zaXplKCktMSwgbGljen07CiAgICAgICAgICAgIFVTVEFXKGxpY3osIFZBTFtpZHhdKTsKICAgICAgICAgICAgbGljeisrOwogICAgICAgIH0KICAgIH0KICAgIGp1bXBbMF1bMF09MDsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gTjsgKytpKXsKICAgICAgICBmb3IoaW50IGogPSAxOyBqIDwgMjA7ICsrail7CiAgICAgICAgICAgIGp1bXBbaV1bal09anVtcFtqdW1wW2ldW2otMV1dW2otMV07CiAgICAgICAgfQogICAgfQogICAgd2hpbGUoUS0tKXsKICAgICAgICBpbnQgQSwgQjsgY2luID4+IEEgPj4gQjsKICAgICAgICBpbnQgbGNhID0gTENBKEEsIEIpOwogICAgICAgIGNvdXQgPDwgbWF4KE1BWE9GUEFUSChBLCBsY2EpLCBNQVhPRlBBVEgoQiwgbGNhKSktbWluKE1JTk9GUEFUSChCLCBsY2EpLCBNSU5PRlBBVEgoQSwgbGNhKSkgPDwgIlxuIjsKICAgIH0KfQ==