Pagini recente » Cod sursa (job #531104) | Cod sursa (job #73259) | Cod sursa (job #2535488) | Cod sursa (job #2981503) | Cod sursa (job #1985528)
#include <stdio.h>
#include <ctype.h>
int lista[250001],nod[300001],next[300001],s[250001][20],nr;
void add(int x,int y)
{
nr++;
next[nr]=lista[x];
lista[x]=nr;
nod[nr]=y;
}
int G()
{
int nr=0;
char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c))
{
nr=nr*10+c-'0';
c=getchar();
}
return nr;
}
int lca(int x,int k)
{
int pas=1<<18,z=0,lg=18;
while(pas)
{
if(z+pas<=k)
x=s[x][lg+1],z+=pas;
pas/=2;
lg--;
}
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++)
{
x=G();
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<=18; j++)
for(i=0; i<=n; i++)
s[i][j]=s[s[i][j-1]][j-1];
for(i=1; i<=m; i++)
{
q=G();
p=G();
printf("%d\n",lca(q,p));
}
return 0;
}