Pagini recente » Cod sursa (job #1179848) | Cod sursa (job #1052053) | Cod sursa (job #200352) | Cod sursa (job #51631) | Cod sursa (job #927964)
Cod sursa(job #927964)
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
int i,j,n,k,lm,m,d[300010][51],nr=0,prim[100010],rang[300010],x,y,niv[100010];
vector<int> a[100010];
void euler(int nod)
{
d[++nr][0]=nod;
prim[nod]=nr;
for(int i=0;i<a[nod].size();++i)
{
niv[a[nod][i]]=niv[nod]+1;
euler(a[nod][i]);
d[++nr][0]=nod;
}
}
int main()
{
FILE *f=fopen("lca.in","r");
FILE *g=fopen("lca.out","w");
fscanf(f,"%d%d",&n,&m);
for(i=2;i<=n;++i)
{
fscanf(f,"%d",&j);
a[j].push_back(i);
}
euler(1);
rang[0]=0;
for(i=2;i<=nr;++i)
rang[i]=rang[i/2]+1;
for(i=1;(1<<i)<=nr;++i)
{
lm=nr-(1<<i)+1;
k=1<<(i-1);
for(j=1;j<=lm;++j)
{
if(niv[d[j][i-1]]<d[j+k][i-1])
d[j][i]=d[j][i-1];
else
d[j][i]=d[j+k][i-1];
}
}
for(i=1;i<=m;++i)
{
fscanf(f,"%d%d",&x,&y);
if(prim[x]<prim[y])
x=prim[x],y=prim[y];
else
{
int aux=x;
x=prim[y],y=prim[aux];
}
k=rang[y-x+1];
lm=(y-x+1)-(1<<k);
int min1;
if(niv[d[x][k]]<niv[d[x+lm][k]])
min1=d[x][k];
else
min1=d[x+lm][k];
fprintf(g,"%d\n",min1);
}
return 0;
}