Pagini recente » Cod sursa (job #1475441) | Cod sursa (job #1818573) | Cod sursa (job #2290945) | Istoria paginii utilizator/fleschinrechin | Cod sursa (job #962375)
Cod sursa(job #962375)
#include<fstream>
#include<vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int x,y,m,n,i,j,niv[100100],a[100100][20];
vector<int>l[100100];
void dfs(int x,int lvl,int t)
{
a[x][0]=t;
niv[x]=lvl;
for(int i=0;i<l[x].size();++i)
if(!niv[l[x][i]])
{
dfs(l[x][i],lvl+1,x);
}
}
int lca(int x,int y)
{
int l1,l2;
if(niv[x]<niv[y])
swap(x,y);
for(l1=1;(1<<l1)<niv[x];++l1);
for(l2=1;(1<<l2)<niv[y];++l2);
while(l1>=0)
{
if(niv[x]-(1<<l1)>=niv[y])
x=a[x][l1];
--l1;
}
if(x==y)
return x;
while(l2>=0)
{
if(a[x][l2]&&a[x][l2]!=a[y][l2])
{
x=a[x][l2];
y=a[y][l2];
}
--l2;
}
return a[x][0];
}
int main()
{
f>>n>>m;
for(i=2;i<=n;++i)
{
f>>x;
l[x].push_back(i);
}
dfs(1,1,0);
for(i=1;(1<<i)<=n;++i)
for(j=1;j<=n;++j)
a[j][i]=a[a[i-1][j]][i-1];
for(;m;--m)
{
f>>x>>y;
g<<lca(x,y)<<'\n';
}
return 0;
}