Pagini recente » Cod sursa (job #228624) | Cod sursa (job #1736298) | Cod sursa (job #3285302) | Cod sursa (job #2921056) | Cod sursa (job #2914914)
#import<fstream>
#import<vector>
#import<string>
#import<set>
#import<map>
#import<algorithm>
#import<deque>
#import<stack>
#import<cmath>
#include <ctype.h>
using namespace std;
//#define int long long
vector<vector<int>>g;
int dp[100001][18];
vector<int>niv,t;
void dfs1(int nod,int tata)
{
t[nod]=tata;
niv[nod]=niv[tata]+1;
for(auto &c:g[nod])
{
dfs1(c,nod);
}
}
main()
{
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,q;
cin>>n>>q;
g.resize(n+1);
t.resize(n+1);
niv.resize(n+1);
for(int i=2;i<=n;i++)
{
int x;
cin>>x;
g[x].push_back(i);
}
niv[1]=-1;
dfs1(1,1);
int niv_max=*max_element(niv.begin()+1,niv.end());
for(int i=2;i<=n;i++)
{
dp[i][0]=t[i];
}
for(int j=1;(1<<j)<=niv_max;j++)
{
for(int i=1;i<=n;i++)
{
if(niv[i]-(1<<j)>=0)
{
dp[i][j]=dp[dp[i][j-1]][j-1];
}
}
}
while(q--)
{
int x,y;
cin>>x>>y;
if(niv[x]>niv[y])
{
swap(x,y);
}
for(int j=20;j>=0;j--)
{
if(niv[y]-(1<<j)>=niv[x])
{
y=dp[y][j];
}
}
if(x==y)
{
cout<<y<<'\n';
continue;
}
for(int j=20;j>=0;j--)
{
if(niv[y]-(1<<j)>=0 && dp[y][j]!=dp[x][j])
{
y=dp[y][j];
x=dp[x][j];
}
}
cout<<t[y]<<'\n';
}
return 0;
}