Pagini recente » Cod sursa (job #1038680) | Cod sursa (job #541809) | Cod sursa (job #364648) | Cod sursa (job #1986121) | Cod sursa (job #393528)
Cod sursa(job #393528)
#include<cstdio>
#include<vector>
#define pb push_back
using namespace std;
#define minn(a,b) ((a<b)?a:b)
#define N 100001
int e[20][N<<2],n,m,x,y,dep[20][N<<2],lung,jum;
vector<int>arb[N],pr(N,0),d(N,0),log(N,0);
void df(int x)
{
e[0][++e[0][0]]=x;
dep[0][e[0][0]]=d[x];
if (!pr[x])
pr[x]=e[0][0];
size_t g=arb[x].size();
for (size_t i=0; i<g; ++i)
{
d[arb[x][i]]=1+d[x];
df(arb[x][i]);
e[0][++e[0][0]]=x;
dep[0][e[0][0]]=d[x];
}
}
void rmq()
{
int i;
log[2]=1;
for(i=3; i<=e[0][0]; ++i)
log[i]=log[i>>1]+1;
for (int i=1; i<=log[e[0][0]]; ++i)
{
lung=1<<i;
jum=lung>>1;
for(int j=1; j+lung-1<=e[0][0]; ++j)
if(dep[i-1][j]<dep[i-1][j+jum])
{
dep[i][j]=dep[i-1][j];
e[i][j]=e[i-1][j];
}
else
{
dep[i][j]=dep[i-1][j+jum];
e[i][j]=e[i-1][j+jum];
}
}
}
void solve()
{
if (pr[x]>pr[y])
swap(x,y);
int dim=pr[y]-pr[x]+1;
int lo=log[dim];
if(dep[lo][pr[x]]<dep[lo][pr[y]-dim+1])
x=e[lo][pr[x]];
else
x=e[lo][pr[y]-dim+1];
}
void citire()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=2; i<=n; ++i)
{
scanf("%d",&x);
arb[x].pb(i);
}
df(1);
/*for (int i=1; i<=e[0][0]; ++i)
printf("%d %d\n",e[0][i],dep[0][i]);*/
rmq();
/*for (int i=0; i<=log[e[0][0]]; ++i)
{
for(int j=1; j<=e[0][0]; ++j)
printf("%d ",dep[i][j]);
printf("\n");
}*/
while (m--)
{
scanf("%d%d",&x,&y);
solve();
printf("%d\n",x);
}
}
int main()
{
citire();
return 0;
}