Cod sursa(job #2582949)

Utilizator RedXtreme45Catalin RedXtreme45 Data 17 martie 2020 15:47:45
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <cmath>
#include <vector>
#define Nmax 32005
using namespace std;
ifstream fin("concurs.in");
ofstream fout("concurs.out");
int n,m,val[Nmax],alt[Nmax],dp[18][2*Nmax],pap[Nmax],nr,v,in,sf,grad[Nmax];
vector <int> G[Nmax];
void DFS(int start)
{
    dp[0][++nr]=start;
    if (!pap[start])
        pap[start]=nr;
    for (auto i:G[start])
    {
        alt[i]=alt[start]+1;
        DFS(i);
        dp[0][++nr]=start;
    }
}
void RMQ()
{
    int o=2*n,x=0,i,j;
    while ((1<<x)<o)
    x++;
    for (i=1;i<x;i++)
        for (j=1;j<=o-(1<<i)+1;j++)
        {
            dp[i][j]=dp[i-1][j];
            if (alt[dp[i][j]]>alt[dp[i-1][j+(1<<(i-1))]])
                dp[i][j]=dp[i-1][j+(1<<(i-1))];
        }
}
int main()
{
    int i,a,b;
    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>val[i];
    for (i=1;i<n;i++){
        fin>>a>>b;
        G[a].push_back(b);
        grad[b]++;
    }
    int root;
    for (i=1;i<=n;i++)
    {
        if (grad[i]==0){
            root=i;
        break;}
    }
    alt[root]=1;
    DFS(root);
    RMQ();
    for (i=1;i<=m;i++)
    {
        fin>>a>>b;
        int a1=min(pap[a],pap[b]),b1=max(pap[a],pap[b]);
        int l=b1-a1+1,x=0;
        while ((1<<x)<=l)
            x++;
        x--;
        int min1=dp[x][a1];
        if (alt[min1]>alt[dp[x][b1-(1<<x)+1]])
            min1=dp[x][b1-(1<<x)+1];
        if (val[min1]>v)
        {
            v=val[min1];
            in=a;
            sf=b;
        }
        else if (val[min1]==v)
        {
            if (in==a)
            {
                if (b<sf)
                {
                    sf=b;
                }
            }
            else if (a<in)
            {
                in=a;
                sf=b;
            }
        }
    }
    fout<<v<<" "<<in<<" "<<sf;
    return 0;
}