Pagini recente » Cod sursa (job #1711453) | Cod sursa (job #942465) | Cod sursa (job #2506763) | Cod sursa (job #622630) | Cod sursa (job #3280805)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,k,t[100005],len,d[200005][25];
int ap[100005],viz[100005],niv[100005];
int e[200005];
vector <int> v[100005];
void dfs(int nod)
{
k++;
e[++len]=nod;
if (!ap[nod])
{
ap[nod]=len;
niv[nod]=k;
}
viz[nod]=1;
for (int i : v[nod])
{
if (!viz[i]) dfs(i);
}
e[++len]=t[nod];
k--;
}
int main()
{
fin>>n>>q;
for (int i=2;i<=n;i++)
{
int nod;
fin>>nod;
t[i]=nod;
v[nod].push_back(i);
}
k=-1;
dfs(1);
len--;
/**for (int i=1;i<=len;i++)
cout<<e[i]<<' ';
cout<<'\n';
for (int i=1;i<=n;i++)
cout<<niv[i]<<' ';**/
for (int i=1;i<=len;i++)
d[i][0]=e[i];
for (int j=1;(1<<j)<=len;j++)
for (int i=1;i+(1<<j)-1<=len;i++)
//d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
{
if (niv[d[i][j-1]]<niv[d[i+(1<<(j-1))][j-1]])
d[i][j]=d[i][j-1];
else d[i][j]=d[i+(1<<(j-1))][j-1];
}
for (int i=1;i<=q;i++)
{
int nod1,nod2;
fin>>nod1>>nod2;
int p1=ap[nod1],p2=ap[nod2];
if (p1>p2) swap(p1,p2);
int p=log2(p2-p1+1);
//int mn=min(d[p1][p],d[p2-(1<<p)+1][p]);
if (niv[d[p1][p]]<niv[d[p2-(1<<p)+1][p]]) fout<<d[p1][p]<<'\n';
else fout<<d[p2-(1<<p)+1][p]<<'\n';
}
return 0;
}