Pagini recente » Cod sursa (job #304109) | Cod sursa (job #322149) | Cod sursa (job #1597683) | Cod sursa (job #2122213) | Cod sursa (job #2165028)
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
FILE*f=fopen("lca.in","r");
FILE*g=fopen("lca.out","w");
int e[200001],k,ap[200001],rm[200001][20],t,use[200001],sol,b,a2,j,a[200001],v[200001],n,m,i,j2;
struct nod{
int inf;
nod *urm;
}*l[100001];
void adaug(nod *&p,int x){
nod *c;
c=new nod;
c->urm=p;
c->inf=x;
p=c;
}
void df(int i,int wt){
v[++k]=wt;
e[k]=i;
if(!ap[i])ap[i]=k;
use[i]=1;
nod *c;
for(c=l[i];c;c=c->urm){
if(!use[c->inf]){ df(c->inf,wt+1);
v[++k]=wt;
e[k]=i;
//if(!ap[i])ap[i]=k;
}
}
} void rmq(){n=k;
for(i=1;i<=n;i++)rm[i][0]=i;
for(j=1;(1<<j)<=n;j++)
for(i=1;i<=n-(1<<j)+1;i++)
{
if(v[rm[i][j-1]]<v[rm[i+(1<<(j-1))][j-1]]) rm[i][j]=rm[i][j-1];
else rm[i][j]=rm[i+(1<<(j-1))][j-1];
}
for(t=1;t<=m;t++){
fscanf(f,"%d%d",&a2,&b);sol=100001;
a2=ap[a2];
b=ap[b];
if(a2>b){
int aux=a2;
a2=b;
b=aux;
}
int dif=b-a2+1;
int l=(int)(log2(dif));
fprintf(g,"%d\n",e[min(rm[a2][l],rm[b-(1<<l)+1][l])]);
}
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for(i=2;i<=n;i++){int x;
fscanf(f,"%d",&x);
adaug(l[i],x);
adaug(l[x],i);
}
df(1,0);
rmq();
return 0;
}