Pagini recente » Cod sursa (job #174241) | Cod sursa (job #825136) | Cod sursa (job #259671) | Cod sursa (job #2805992) | Cod sursa (job #3173104)
#include <fstream>
#include <vector>
const int NMAX=200005;
const int LOG=17;
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int);
void init_lca();
bool is_ancestor(int, int);
int lca(int, int);
int dp[LOG+3][NMAX], in[NMAX], out[NMAX];
vector <int> v[NMAX];
int n, q, cnt;
int main()
{
int i, a, b;
fin>>n>>q;
for(i=2; i<=n; i++)
{
fin>>dp[0][i];
v[dp[0][i]].push_back(i);
}
dfs(1);
init_lca();
for(i=1; i<=q; i++)
{
fin>>a>>b;
fout<<lca(a, b)<<'\n';
}
}
int lca(int a, int b)
{
int i;
if(is_ancestor(a, b)) return a;
if(is_ancestor(b, a)) return b;
for(i=LOG; i>=0; i--)
{
if(!is_ancestor(dp[i][a], b) && dp[i][a]!=0)
{
a=dp[i][a];
}
}
return dp[0][a];
}
bool is_ancestor(int a, int nod)
{
return (in[a]<in[nod] && out[a]>out[nod]);
}
void init_lca()
{
int i, j;
for(j=1; j<=LOG; j++)
{
for(i=1; i<=n; i++)
{
dp[j][i]=dp[j-1][dp[j-1][i]];
}
}
}
void dfs(int nod)
{
in[nod]=++cnt;
for(auto i:v[nod])
{
if(!in[i]) dfs(i);
}
out[nod]=++cnt;
}