Cod sursa(job #1140784)

Utilizator teoionescuIonescu Teodor teoionescu Data 12 martie 2014 11:44:11
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#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;
}