Pagini recente » Cod sursa (job #2948032) | Cod sursa (job #2148784) | Cod sursa (job #1275188) | Cod sursa (job #2728144) | Cod sursa (job #2848279)
#include <fstream>
#include <vector>
#include <algorithm>
#define uint unsigned int
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,m,x,y;
vector<int> g[100001];
vector<pair<int,int>> v;
int first[100001],lg[200001];
pair<int,int> dp[18][200001];
void dfs(int nod,int d,int t)
{
first[nod]=v.size();
v.push_back({nod,d});
for(auto i:g[nod])
{
if(i==t) continue;
dfs(i,d+1,nod);
v.push_back({nod,d});
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<n;i++)
{
cin>>x;
g[i+1].push_back(x);
g[x].push_back(i+1);
}
dfs(1,0,0);
for(uint i=2;i<=v.size();i++)
lg[i]=lg[i/2]+1;
for(uint i=0;i<v.size();i++)
{
dp[0][i].first=v[i].second;
dp[0][i].second=v[i].first;
}
for(int j=1;j<=lg[v.size()];j++)
{
for(uint i=0;i+(1<<(j-1))<v.size();i++)
dp[j][i]=min(dp[j-1][i],dp[j-1][i+(1<<(j-1))]);
}
for(int i=1;i<=m;i++)
{
cin>>x>>y;
x=first[x],y=first[y];
if(x>y) swap(x,y);
int j=lg[y-x+1];
if(dp[j][x].first<dp[j][y-(1<<j)+1].first)
cout<<dp[j][x].second<<'\n';
else
cout<<dp[j][y-(1<<j)+1].second<<'\n';
}
return 0;
}