Pagini recente » Cod sursa (job #1524432) | Cod sursa (job #3293408) | Clasament moisil2016-9 | Cod sursa (job #3244471) | Cod sursa (job #3226769)
#include <fstream>
#include <vector>
const int NMAX=100005;
const int LGMAX=18;
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
void dfs(int);
bool is_ancestor(int, int);
int lca(int, int);
int dp[20][NMAX], in[NMAX], out[NMAX];
vector <int> v[NMAX];
int n, q, cnt;
int main()
{
int i, j, a, b;
cin>>n>>q;
for(i=2; i<=n; i++)
{
cin>>a;
v[a].push_back(i);
dp[0][i]=a;
}
dfs(1);
for(j=1; j<=LGMAX; j++)
{
for(i=1; i<=n; i++)
dp[j][i]=dp[j-1][dp[j-1][i]];
}
while(q--)
{
cin>>a>>b;
cout<<lca(a, b)<<'\n';
}
return 0;
}
int lca(int a, int b)
{
int j;
if(is_ancestor(a, b)) return a;
if(is_ancestor(b, a)) return b;
for(j=LGMAX; j>=0; j--)
{
if(dp[j][a] && !is_ancestor(dp[j][a], b))
a=dp[j][a];
}
return dp[0][a];
}
bool is_ancestor(int a, int b)
{
return (in[a]<=in[b] && out[a]>=out[b]);
}
void dfs(int nod)
{
in[nod]=++cnt;
for(auto i:v[nod]) dfs(i);
out[nod]=++cnt;
}