Pagini recente » Cod sursa (job #3209653) | Cod sursa (job #1865392) | Cod sursa (job #3211457) | Cod sursa (job #3180316) | Cod sursa (job #813116)
Cod sursa(job #813116)
#include<stdio.h>
#include<vector>
using namespace std;
FILE*f=fopen("lca.in","r");
FILE*g=fopen("lca.out","w");
int m,n,p[400001],w[400001],t[100001],poz[100001],nr,x,y,a[20][400001],lvl[100001];
vector <int> v[100001];
void dfs(int nod,int niv)
{
w[++nr]=nod;
if(!poz[nod])
{
poz[nod]=nr;
lvl[nod]=niv;
}
for(int i=0;i<v[nod].size();++i)
{
dfs(v[nod][i],niv+1);
w[++nr]=nod;
}
return ;
}
int min(int a,int b)
{
if(lvl[a]<lvl[b])
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/2]+1;
for(int i=1;i<=nr;++i)
a[0][i]=w[i];
for(int i=1;i<=p[nr];++i)
for(int j=1;j<=nr-(1<<i)+1;++j)
a[i][j]=min(a[i-1][j],a[i-1][j+(1<<(i-1))]);
for(int i=1;i<=m;++i)
{
fscanf(f,"%d%d",&x,&y);
x=poz[x];
y=poz[y];
if(x>y)
{
int aux=x;
x=y;
y=aux;
}
int L=y-x+1;
int sol=min(a[p[L]][x],a[p[L]][y-(1<<p[L])+1]);
fprintf(g,"%d\n",sol);
}
fclose(f);
fclose(g);
return 0;
}