Pagini recente » Cod sursa (job #1946896) | Cod sursa (job #1997150) | Cod sursa (job #3195038) | Cod sursa (job #53880) | Cod sursa (job #677759)
Cod sursa(job #677759)
#include<stdio.h>
#include<vector>
using namespace std;
FILE*f=fopen("lca.in","r");
FILE*g=fopen("lca.out","w");
int n,m,w[200005],nr1,nr,lvl[100001],t[100001],pr[100001],x,y,pp[200001],p[200001];
vector <int> v[100001];
void dfs(int nod,int niv)
{
lvl[nod]=niv;
w[++nr]=nod;
pr[nod]=nr;
for(int i=0;i<v[nod].size();++i)
{
dfs(v[nod][i],niv+1);
w[++nr]=nod;
}
}
struct rmq
{
int x,y;
} a[400001][20];
rmq min(rmq a,rmq b)
{
if(a.x<b.x)
return a;
return b;
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for(int i=2;i<=n;++i)
{
fscanf(f,"%d",&t[i]);
v[t[i]].push_back (i);
}
dfs(1,1);
for(int i=2;i<=nr;++i)
p[i]=p[i>>1]+1;
pp[0]=1;
for(int i=1;i<=18;++i)
pp[i]=pp[i-1]<<1;
for(int i=1;i<=nr;++i)
{
a[i][0].x=lvl[w[i]];
a[i][0].y=w[i];
}
for(int j=1;j<=p[nr];++j)
for(int i=1;i<=nr;++i)
a[i][j]=min(a[i][j-1],a[i+pp[j-1]][j-1]);
for(int i=1;i<=m;++i)
{
fscanf(f,"%d%d",&x,&y);
x=pr[x];
y=pr[y];
if(x>y)
{
int aux=x;
x=y;
y=aux;
}
fprintf(g,"%d\n",min(a[x][p[y-x+1]],a[y-pp[p[y-x+1]]+1][p[y-x+1]]).y);
}
fclose(g);
fclose(f);
return 0;
}