Pagini recente » Cod sursa (job #960744) | Cod sursa (job #1505594) | Cod sursa (job #1366949) | Monitorul de evaluare | Cod sursa (job #3309595)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int nmax=1e5+3;
int n, m, aux, timp, l;
vector <int> v[nmax];
int in[nmax], out[nmax];
int up[nmax][18];
void dfs(int u, int p)
{
in[u]=timp++;
up[u][0]=p;
for(int i=1; i<=l; i++)
up[u][i]=up[up[u][i-1]][i-1];
for(auto i:v[u])
dfs(i, u);
out[u]=timp++;
}
bool stramos(int u, int v)//true, daca u este stramos lui v
{
return in[u]<=in[v] && out[v]<=out[u];
}
int query(int u, int v)
{
if(stramos(u, v)) return u;
if(stramos(v, u)) return v;
for(int i=l; i>=0; i--)
{
if(!stramos(up[u][i], v))
u=up[u][i];
}
return up[u][0];
}
int main()
{
fin>>n>>m;
for(int i=2; i<=n; i++)
{
fin>>aux;
v[aux].push_back(i);
}
l=ceil(log2(n));
timp=1;
for(int i=0; i<=l; i++)
up[1][i]=0;
dfs(1, 0);
in[0]=0;
out[0]=timp;
for(int i=1; i<=m; i++)
{
int u, v;
fin>>u>>v;
fout<<query(u, v)<<'\n';
}
return 0;
}