Pagini recente » Cod sursa (job #1757158) | Cod sursa (job #463852) | Cod sursa (job #708247) | Cod sursa (job #1832355) | Cod sursa (job #1797041)
#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<=N;i++)
{
fscanf(IN,"%d",&val[i]),h[i]=h[val[i]]+1;
Graph[val[i]].push_back(i);
}
DFS(1);
for(int i=2;i<=size;i++)
L[i]=L[i/2]+1;
for(int i=1;i<=size;i++)
for(int j=1;j<MaxLog;j++)
if(i>=1<<j)
{
v[j][i]=v[j-1][i];
if(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;
}