Pagini recente » Istoria paginii utilizator/beniboy98 | Istoria paginii utilizator/drewtheson | Istoria paginii utilizator/shapka-nevedimka | Monitorul de evaluare | Cod sursa (job #1796989)
#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];
bool visited[MaxN];
vector <int> Graph[MaxN];
void DFS(int node)
{
first[node]=size+1;
v[0][++size]=node;
visited[node]=true;
for(int i=0;i<Graph[node].size();i++)
if(!visited[Graph[node][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);
Graph[i].push_back(val[i]);
}
DFS(1);
for(int i=1;i<=2*N-1;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];
Log=L[Y-X+1];
fprintf(OUT,"%d\n",min(v[Log][Y],v[Log][X+(1<<Log)-1]));
}
return 0;
}