Pagini recente » Cod sursa (job #214256) | Cod sursa (job #3147547) | Cod sursa (job #3338229) | Cod sursa (job #233900) | Cod sursa (job #3309593)
#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
{
if(out[u]==0) out[u]=nmax, in[u]=0;
if(out[v]==0) out[v]=nmax, in[v]=0;
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;
dfs(1, 0);
for(int i=1; i<=m; i++)
{
int u, v;
fin>>u>>v;
fout<<query(u, v)<<'\n';
}
return 0;
}