Pagini recente » Cod sursa (job #367292) | Cod sursa (job #2850292) | Cod sursa (job #1467838) | Cod sursa (job #99198) | Cod sursa (job #385389)
Cod sursa(job #385389)
#include<fstream.h>
#include<iostream.h>
int v[100100][2],start[100100],eu[202000],q,k,x,n,m,padre[100100],lg[202000],
a[18][202000],y,lo,l,ln[202000],beg[101000],viz[100100];
void dfs(int nod, int depth)
{
int t;
eu[++k]=nod;
if(!viz[nod])
{
viz[nod]=1;
beg[nod]=k;
}
ln[k]=depth;
t=start[nod];
while(t)
{
dfs(v[t][0],depth+1);
t=v[t][1];
}
eu[++k]=padre[nod];
ln[k]=depth-1;
}
int main()
{
int i,j;
ifstream f("lca.in");
ofstream g("lca.out");
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
padre[i]=x;
v[++q][0]=i;
v[q][1]=start[x];
start[x]=q;
}
dfs(1,0);
k--;
lg[1]=0;
lg[0]=-1;
for(i=2;i<=k;i++)
lg[i]=lg[i>>1]+1;
for(i=1;i<=k;i++)
a[0][i]=i;
for(j=1;j<=lg[k];j++)
for(i=1;j<=lg[k-i+1];i++)
if(ln[a[j-1][i]]<ln[a[j-1][i+(1<<(j-1))]])
a[j][i]=a[j-1][i];
else
a[j][i]=a[j-1][i+(1<<(j-1))];
for(i=1;i<=m;i++)
{
f>>x>>y;
x=beg[x];
y=beg[y];
if(x>y)
{
l=x;
x=y;
y=l;
}
l=y-x+1;
lo=lg[l];
if(a[lo][x]<a[lo][y-(1<<lo)+1])
g<<eu[a[lo][x]]<<'\n';
else
g<<eu[a[lo][y-(1<<lo)+1]]<<'\n';
}
return 0;
}