Pagini recente » Istoria paginii utilizator/bosoccristina | Cod sursa (job #1943840) | Cod sursa (job #1340180) | Cod sursa (job #331387) | Cod sursa (job #3132743)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m;
int tata[100005];
vector<int> muchii[100005];
int in[100005],out[100005];
int timp;
int stramosi[100005][21];
bool esteparinte(int u,int v)
{
if(in[u]<=in[v]&&out[u]>=out[v])
return 1;
return 0;
}
int LCA(int u,int v)
{
if(esteparinte(u,v))
return u;
if(esteparinte(v,u))
return v;
for(int i=17;i>=0;i--)
if(stramosi[u][i]!=0&&!esteparinte(stramosi[u][i],v))
u=stramosi[u][i];
return tata[u];
}
void dfs(int nod)
{
timp++;
in[nod]=timp;
stramosi[nod][0]=tata[nod];
for(int i=1;i<=17;i++)
stramosi[nod][i]=stramosi[stramosi[nod][i-1]][i-1];
for(int i:muchii[nod])
if(i!=tata[nod])
dfs(i);
out[nod]=timp;
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
fin>>tata[i];
muchii[i].push_back(tata[i]);
muchii[tata[i]].push_back(i);
}
dfs(1);
while(m--)
{
int u,v;
fin>>u>>v;
fout<<LCA(u,v)<<'\n';
}
return 0;
}