Pagini recente » Cod sursa (job #2649716) | Cod sursa (job #925750) | Cod sursa (job #627354) | Cod sursa (job #1840820) | Cod sursa (job #2907454)
#include <fstream>
#define NMax 100000
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int f[20][NMax],level[NMax],log[NMax],n,m,i,j,x,y;
int stramos(int x,int l)
{
for(i=0;i<=log[l];i++)
{
if(l%2 == 1)
x=f[i][x];
l=l/2;
}
return x;
}
void lca(int x,int y)
{
if(level[x]!=level[y])
{
if(level[x]<level[y])
swap(x,y);
x = stramos(x,level[x]-level[y]);
}
int l = log[level[x]];
for(i=l;i>=0;i--)
{
if(f[i][x]!=f[i][y])
{
x=f[i][x];
y=f[i][y];
}
}
fout<<f[0][x]<<"\n";
}
void next(int x)
{
if(level[x]!=0)
return;
next(f[0][x]);
level[x]=level[f[0][x]]+1;
}
void lvl()
{
level[1]=0;
for(int i=2;i<=n;i++)
next(i);
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>f[0][i];
f[0][1]=0;
for(j=1;(1<<j)<=n;j++)
{
for (i=1;i<=n-(1<<j)+1;i++)
{
f[j][i]=f[j-1][f[j-1][i]];
}
}
lvl();
log[1]=0;
for(j=2;j<=n;j++)
log[j]=1+log[j/2];
for(i=1;i<=m;i++)
{
fin>>x>>y;
lca(x,y);
}
return 0;
}