Pagini recente » Cod sursa (job #2680968) | Cod sursa (job #2280045)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int N = 1000001;
const int L = 16;
int n,ti[N],to[N],m,tati[N],s[L][N],timp=0;
vector<int> fii[N];
void dfs(int x)
{
ti[x]=++timp;
for(auto y:fii[x])
{
dfs(y);
}
to[x]=++timp;
}
bool stramos(int x,int y)
{
return (ti[x]<=ti[y] && to[y]<=to[x]);
}
int lca (int x,int y)
{
int pas=L;
if (stramos(x,y)) return x;
if (stramos(y,x)) return y;
while(pas>=0)
{
if((s[pas][x]!=0) && !stramos(s[pas][x],y))
{
x=s[pas][x];
}
pas--;
}
return s[0][x];
}
int main()
{
fstream f("lca.in");
f>>n>>m;
int i,t,j=1,x,y;
for(i=2; i<=n; i++)
{
f>>s[0][i];//tati[i];
//s[1][(j++)+1]=tati[i];
fii[s[0][i]].push_back(i);
}
for(int i=1; (1<<i)<=n ; i++)
{
for(int j=1; j<=n; j++)
{
s[i][j]=s[i-1][s[i-1][j]];
}
}
dfs(1);
/*for(i=1;i<=n;i++)
cout<<ti[i]<<" "<<to[i]<<endl; */
for(i=0; i<=4; i++)
{
for(j=1; j<=n; j++)
{
cout<<s[i][j]<<" ";
}
cout<<endl;
}
ofstream g("lca.out");
for(int a=1; a<=m; a++)
{
f>>x>>y;
t=lca(x,y);
g<<t<<endl;
}
return 0;
}