Pagini recente » Cod sursa (job #2326373) | Cod sursa (job #2751086) | Cod sursa (job #1260275) | Cod sursa (job #2879042) | Cod sursa (job #1559101)
#include <bits/stdc++.h>
using namespace std;
ifstream f("LCA.in");
ofstream g("LCA.out");
#define LE 200666
#define pb push_back
int fap[LE],lap[LE],my_stack[LE],lev[LE],k;
vector<int> H[LE];
bool viz[LE];
int stack_size,random_up[LE],fth[LE];
void dfs(int nod)
{
int N=H[nod].size(),i;
viz[nod]=true;
fap[nod]=++k;
my_stack[++stack_size]=nod;
int D=rand()%stack_size+1;
random_up[nod]=my_stack[D];
for(i=0;i<N;++i)
if (viz[H[nod][i]]==false)
{
lev[H[nod][i]]=lev[nod]+1;
dfs(H[nod][i]);
}
--stack_size;
lap[nod]=k;
}
bool is_inside(int n1,int n2){
return (fap[n2]>=fap[n1]&&fap[n2]<=lap[n1]);
}
int LCA(int n1,int n2)
{
while (n1!=n2)
{
if (is_inside(random_up[n1],n2)==false) n1=random_up[n1];
if (is_inside(random_up[n2],n1)==false) n2=random_up[n2];
if (n1!=n2)
{
if (lev[n1]>=lev[n2]) n1=fth[n1];
else n2=fth[n2];
}
}
return n1;
}
int main()
{
int n,i,m;
f>>n>>m;
for(i=2;i<=n;++i)
{
f>>fth[i];
H[fth[i]].pb(i);
H[i].pb(fth[i]);
}
dfs(1);
for(i=1;i<=m;++i)
{
int xx,yy;
f>>xx>>yy;
g<<LCA(xx,yy)<<'\n';
}
return 0;
}