Pagini recente » Cod sursa (job #1222615) | Cod sursa (job #962986) | Cod sursa (job #1124621) | Cod sursa (job #1274373) | Cod sursa (job #1797021)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2140000000
#define MaxN 100005
#define MaxLog 17
using namespace std;
FILE *IN,*OUT;
int N,M,size=0,L[2*MaxN],v[MaxLog][2*MaxN],h[MaxN],val[MaxN],X,Y,Log,first[MaxN],Ans;
vector <int> Graph[MaxN];
void DFS(int node)
{
first[node]=size+1;
v[0][++size]=node;
for(int i=0;i<Graph[node].size();i++)
DFS(Graph[node][i]);
v[0][++size]=val[node];
}
int main()
{
IN=fopen("lca.in","r");
OUT=fopen("lca.out","w");
fscanf(IN,"%d%d",&N,&M);
for(int i=2;i<=2*N;i++)
L[i]=L[i/2]+1;
for(int i=2;i<=N;i++)
{
fscanf(IN,"%d",&val[i]),h[i]=h[val[i]]+1;
Graph[val[i]].push_back(i);
}
DFS(1);
for(int i=1;i<=size;i++)
for(int j=1;j<MaxLog;j++)
{
v[j][i]=v[j-1][i];
if(i>1<<(j-1)&&h[v[j][i]]>h[v[j-1][i-(1<<(j-1))]])
v[j][i]=v[j-1][i-(1<<(j-1))];
}
for(int i=1;i<=M;i++)
{
fscanf(IN,"%d%d",&X,&Y);
X=first[X],Y=first[Y];
if(X>Y)
{
int t=X;
X=Y;
Y=t;
}
Log=L[Y-X+1];
Ans=v[Log][Y];
if(h[Ans]>h[v[Log][X+(1<<Log)-1]])
Ans=v[Log][X+(1<<Log)-1];
fprintf(OUT,"%d\n",Ans);
}
return 0;
}