Pagini recente » Cod sursa (job #100654) | Cod sursa (job #225653) | Cod sursa (job #3148423) | Cod sursa (job #1721611) | Cod sursa (job #2769199)
#include <bits/stdc++.h>
#define dim 100005
#define mod 1000000007
#define int long long
#define INF 2000000000
using namespace std;
ifstream fin ("lca.in");
ofstream fout("lca.out");
int n,poz[dim],k,put[21],apr[2*dim];
vector<int>a[dim];
struct el
{
int nod,niv;
} rmq[20][2*dim];
void dfs (el x)
{
rmq[0][++k]=x;
if (poz[x.nod]==0)
poz[x.nod]=k;
for (auto y:a[x.nod])
{
dfs({y,x.niv+1});
rmq[0][++k]=x;
}
}
el mini(el x,el y)
{
if (x.niv==y.niv)
{
if (x.nod<y.nod)
return x;
return y;
}
else if (x.niv<y.niv)
return x;
else return y;
}
void Solve ()
{
int i,j,nr=1,y=0;
put[0]=1;
for (i=1;i<=k;i++)
{
if (nr*2==i)
{
nr*=2,++y;
put[y]=nr;
}
apr[i]=y;
}
for (i=1;i<=17;i++)
for (j=1;j<=k-put[i]+1;j++)
rmq[i][j]=mini(rmq[i-1][j],rmq[i-1][j+put[i-1]]);
}
int rez(int x,int y)
{
int lg=y-x+1;
el z=mini(rmq[apr[lg]][x],rmq[apr[lg]][y-put[apr[lg]]+1]);
return z.nod;
}
int32_t main()
{
int i,t,x,y;
fin>>n>>t;
for (i=2; i<=n; i++)
{
fin>>x;
a[x].push_back(i);
}
dfs({1,0});
Solve ();
while (t--)
{
fin>>x>>y;
x=poz[x],y=poz[y];
if (y<x)
swap(x,y);
fout<<rez(x,y)<<'\n';
}
}