Pagini recente » Cod sursa (job #647578) | Cod sursa (job #1225646) | Cod sursa (job #1905045) | Cod sursa (job #788483) | Cod sursa (job #1140784)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream in("concurs.in");
ofstream out("concurs.out");
const int Nmax = 32001;
int N,M;
vector<int> G[Nmax];
int v[Nmax],L[Nmax],First[Nmax];
int E[2*Nmax],K;
int rmq[16][2*Nmax];
int lg[2*Nmax];
int Ans,Ansx,Ansy;
void Dfs(int x,int lev){
L[x]=lev;
E[++K]=x;
First[x]=K;
for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
Dfs(*it,lev+1);
E[++K]=x;
}
}
int MinL(int a,int b){
return (L[a]<L[b]?(a):(b));
}
void compute(){
for(int i=1;i<=K;i++) rmq[0][i]=E[i];
for(int i=2;i<=K;i++) lg[i]=lg[i/2]+1;
for(int i=1;(1<<i)<=K;i++){
for(int j=1;j+(1<<i)<=K;j++){
rmq[i][j]=MinL(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
}
}
int Rmq(int a,int b){
a=First[a];
b=First[b];
if(a>b) swap(a,b);
int dist=b-a;
int ldist=lg[dist];
int powl=1<<ldist;
return MinL(rmq[ldist][a],rmq[ldist][a+dist-powl+1]);
}
int main(){
in>>N>>M;
for(int i=1;i<=N;i++) in>>v[i];
for(int i=1;i<N;i++){
int x,y;
in>>x>>y;
G[x].push_back(y);
}
Dfs(1,1);
compute();
for(int i=1;i<=M;i++){
int x,y;
in>>x>>y;
int c=v[Rmq(x,y)];
if(c>Ans) Ans=c,Ansx=x,Ansy=y;
else if(c==Ans){
if(x<Ansx) Ansx=x,Ansy=y;
else if(x==Ansx){
if(y<Ansy) Ansy=y;
}
}
}
out<<Ans<<' '<<Ansx<<' '<<Ansy<<'\n';
return 0;
}