Pagini recente » Cod sursa (job #1686234) | Cod sursa (job #2455699) | Cod sursa (job #539574) | Cod sursa (job #1264242) | Cod sursa (job #2977275)
#include <fstream>
#include <iostream>
#include <vector>
#include <cmath>
const int NMAX=250005;
const int LGMAX=32;
const int LOG=18;
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> v[NMAX];
int dp[LGMAX][NMAX];
int in[NMAX], out[NMAX];
int n, q, timp;
void build();
int LCA(int, int);
void dfs(int);
bool is_anc(int, int);
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
int i, a, b;
fin>>n>>q;
for(i=2; i<=n; i++)
{
fin>>dp[0][i];
v[dp[0][i]].push_back(i);
}
dp[0][1]=1;
build();
while(q--)
{
fin>>a>>b;
fout<<LCA(a, b)<<'\n';
}
return 0;
}
void dfs(int nod)
{
in[nod]=++timp;
for(auto i:v[nod])
dfs(i);
out[nod]=++timp;
}
bool is_anc(int a, int b)
{
return (in[a]<in[b] && out[a]>out[b]);
}
int LCA(int a, int b)
{
int j;
if(is_anc(a, b)) return a;
if(is_anc(b, a)) return b;
for(j=LOG; j>=0; j--)
{
if(!is_anc(dp[j][a], b))
a=dp[j][a];
}
return dp[0][a];
}
void build()
{
int i, j;
dfs(1);
for(i=1; (1<<i)<=n; i++)
{
for(j=1; j<=n; j++) dp[i][j]=dp[i-1][dp[i-1][j]];
}
}