Pagini recente » Cod sursa (job #1567875) | Cod sursa (job #2715035) | Cod sursa (job #2417024) | Cod sursa (job #2165059) | Cod sursa (job #2278562)
#include <cstdio>
#include <algorithm>
#include <vector>
#define DIMN 100010
#define LOGN 20
#define DIM_EULER 2*DIMN
#define INF 2000000000
using namespace std;
int elem;
int eul[DIM_EULER],niv[DIMN],pp[DIMN],logg[DIM_EULER];
pair <int,int> rmq[LOGN][DIM_EULER];
vector <int> v[DIMN];
void dfs (int nod){
int i,vecin;
pp[nod]=elem+1;
eul[++elem]=nod;
for (i=0;i<v[nod].size();i++){
vecin=v[nod][i];
niv[vecin]=1+niv[nod];
dfs (vecin);
eul[++elem]=nod;
}
}
int qry (int st,int dr){
int l;
pair <int,int> sol;
if (st>dr)
swap(st,dr);
l=logg[dr-st+1];
sol=min(rmq[l][st],rmq[l][dr-(1<<l)+1]);
return sol.second;
}
int main()
{
FILE *fin=fopen ("lca.in","r");
FILE *fout=fopen ("lca.out","w");
int n,q,i,x,p2,y;
fscanf (fin,"%d%d",&n,&q);
for (i=2;i<=n;i++){
fscanf (fin,"%d",&x);
v[x].push_back(i);
}
niv[1]=1;
dfs (1);
for (i=1;i<=elem;i++)
rmq[0][i]=make_pair(niv[eul[i]],i);
for (i=2;i<=elem;i++)
logg[i]=logg[i/2]+1;
for (p2=1;(1<<p2)<=elem;p2++){
for (i=1;i<=elem;i++){
rmq[p2][i]=rmq[p2-1][i];
if (i+(1<<(p2-1))<=elem && rmq[p2][i].first>rmq[p2-1][i+(1<<(p2-1))].first)
rmq[p2][i]=rmq[p2-1][i+(1<<(p2-1))];
}
}
for (;q;q--){
fscanf (fin,"%d%d",&x,&y);
fprintf (fout,"%d\n",eul[qry(pp[x],pp[y])]);
}
return 0;
}