Pagini recente » Cod sursa (job #1876547) | Istoria paginii runda/sada | Cod sursa (job #1223037) | Cod sursa (job #577359) | Cod sursa (job #1198799)
#include <cstdio>
#include <vector>
#define N 100010
#define M 1700010
using namespace std;
int T[N],P[N],niv[N];
int n,m,i,k,pre[M],val,j,K;
vector<int> E[17],v[N];
void euler(int),rmq();
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=2;i<=n;i++)
{
scanf("%d",&T[i]);
v[T[i]].push_back(i);
}
E[0].push_back(0);
euler(1);
rmq();
for(i=2;i<=k;i++)
{
pre[i]=val;
if(i==(i&(-i)))val++;
}
for(;m;m--)
{
scanf("%d%d",&i,&j);
i=P[i];
j=P[j];
if(i>j)
i^=j^=i^=j;
k=j-i+1;k=pre[k];
K=1<<k;
j=j-K+1;
i=E[k][i];
j=E[k][j];
niv[i]<niv[j]?printf("%d\n",i):printf("%d\n",j);
}
return 0;
}
void euler(int nod)
{
niv[nod]=niv[T[nod]]+1;k++;
P[nod]=k;
E[0].push_back(nod);
for(vector<int> ::iterator it=v[nod].begin();it!=v[nod].end();it++)
{
euler(*it);
E[0].push_back(nod);k++;
}
}
void rmq()
{
int R,L,St,Mi,j;
for(i=1,j=2;j<=k;i++,j<<=1)
{
E[i].push_back(0);
for(L=1,R=j;R<=k;L++,R++)
{
St=E[i-1][L];
Mi=E[i-1][L+j/2];
St=niv[St]<niv[Mi]?St:Mi;
E[i].push_back(St);
}
}
}