Pagini recente » Cod sursa (job #2579585) | Cod sursa (job #814255) | Cod sursa (job #3249956) | Cod sursa (job #1739352) | Cod sursa (job #1985510)
#include <stdio.h>
int lista[250001],nod[300001],next[300001],s[250001][21],nr;
void add(int x,int y)
{
nr++;
next[nr]=lista[x];
lista[x]=nr;
nod[nr]=y;
}
int lca(int x,int k)
{
int pas=20,z=0;
while(pas)
{
if(z+pas<=k)
x=s[x][pas],z+=pas;
pas/=2;
}
return x;
}
int main()
{
int n,m,i,x,z,q,p,j;
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&x);
add(x,i);
}
for(i=0; i<=n; i++)
{
z=lista[i];
while(z)
{
s[nod[z]][1]=i;
z=next[z];
}
}
for(j=2; j<=20; j++)
for(i=0; i<=n; i++)
s[i][j]=s[s[i][j-1]][j-1];
for(i=1; i<=m; i++)
{
scanf("%d%d",&q,&p);
printf("%d\n",lca(q,p));
}
return 0;
}