Pagini recente » Cod sursa (job #2770029) | Cod sursa (job #2930119) | Cod sursa (job #2807616) | Cod sursa (job #2444220) | Cod sursa (job #673223)
Cod sursa(job #673223)
#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;
vector<int> a[100010];
void euler(int nod)
{
d[++nr][0]=nod;
prim[nod]=nr;
for(int i=0;i<a[nod].size();++i)
{
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)
d[j][i]=min(d[j][i-1],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=min(d[x][k],d[x+lm][k]);
fprintf(g,"%d\n",min1);
}
return 0;
}