Pagini recente » Cod sursa (job #1693847) | Cod sursa (job #1661218) | Istoria paginii runda/baraj4_juniori_2014 | Cod sursa (job #3255592) | Cod sursa (job #2582949)
#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;
}