Pagini recente » Cod sursa (job #453666) | Cod sursa (job #1118264) | Cod sursa (job #1490395) | Cod sursa (job #2146053) | Cod sursa (job #2278536)
#include <cstdio>
#include <algorithm>
#define DIMN 100010
#define LOGN 17
#define DIM_EULER 4*DIMN
#define INF 2000000000
using namespace std;
int elem;
int eul[DIM_EULER],niv[DIMN],pp[DIMN];
pair <int,int> rmq[LOGN][DIMN];
vector <int> v[DIMN];
void dfs (int nod){
int i,vecin;
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 p2,sol,psol;
if (st>dr)
swap(st,dr);
p2=0;
while ((1<<p2)<=(dr-st+1))
p2++;
p2--;
sol=INF;
psol=0;
while (p2>=0){
if (st+(1<<p2)-1<=dr){ // e ok
if (sol>rmq[p2][st].first){
sol=rmq[p2][st].first;
psol=rmq[p2][st].second;
}
st=st+(1<<p2)-1;
}
p2--;
}
return psol;
}
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++){
if (!pp[eul[i]])
pp[eul[i]]=i;
}
for (i=1;i<=elem;i++)
rmq[0][i]=make_pair(niv[eul[i]],i);
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;
}