Pagini recente » Cod sursa (job #361870) | Cod sursa (job #2443666) | Cod sursa (job #2128876) | Cod sursa (job #118390) | Cod sursa (job #3206848)
#include <fstream>
#include <vector>
#define NMAX 100009
std::ifstream fin("lca.in");
std::ofstream fout("lca.out");
int dp[30][NMAX],contor;
std::vector <int> g[NMAX];
int in[NMAX],out[NMAX];
int t,n,m,aux;
bool ancestor(int x,int y);
int lca(int p,int q);
void dfs(int x);
int main()
{
fin>>n>>m;
dp[0][1]=1;
for(int i=2;i<=n;i++)
{
fin>>t;
g[t].push_back(i);
dp[0][i]=t;
}
dfs(1);
for(int i=1;i<=m;i++)
{
int p,q;
fin>>p>>q;
fout<<lca(p,q)<<'\n';
}//fout<<dp[15][3];
return 0;
}
void dfs(int x)
{
for(int i=1;i<=20;i++)
dp[i][x]=dp[i-1][dp[i-1][x]];
in[x]=++contor;
for(int i=0;i<g[x].size();i++)
dfs(g[x][i]);
out[x]=++contor;
}
bool ancestor(int x,int y)
{
return in[x]<=in[y] && out[x]>=out[y];
}
int lca(int p,int q)
{
if(ancestor(p,q))
return p;
if(ancestor(q,p))
return q;
for(int j=20;j>=0;j--)
{
if(!ancestor(dp[j][p],q))
p=dp[j][p];
}
return dp[0][p];
}