Pagini recente » Cod sursa (job #3282292) | Cod sursa (job #273560) | Cod sursa (job #1651914) | Cod sursa (job #2458798) | Cod sursa (job #3206840)
#include <fstream>
#include <vector>
#define NMAX 100009
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int dp[30][NMAX],contor;
vector <int> g[NMAX];
int in[NMAX],out[NMAX];
int t,n,m,aux;
bool ancestor(int x,int y);
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;
for(int j=20;j>=0;j--)
{
if(!ancestor(dp[j][p],q))
p=dp[j][p];
}
fout<<dp[0][p]<<'\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];
}