Pagini recente » Cod sursa (job #380511) | Cod sursa (job #2346282) | Cod sursa (job #1655515) | Cod sursa (job #978644) | Cod sursa (job #2151417)
#include <fstream>
#include <vector>
#define MAXN 100005
#define LOGN 25
using namespace std;
ifstream fi("lca.in");
ofstream fo("lca.out");
int n,m;
int P[MAXN],depth[MAXN];
int str[LOGN][MAXN];
vector <int> G[MAXN];
void dfs(int nod)
{
for (auto v: G[nod])
{
depth[v]=depth[nod]+1;
dfs(v);
}
}
void precalc()
{
for (int i=1; i<=n; i++)
str[0][i]=P[i];
for (int b=1; (1<<b)<=n; b++)
{
for (int i=1; i<=n; i++)
{
str[b][i]=str[b-1][str[b-1][i]];
}
}
}
int lca(int u,int v)
{
while (depth[u]!=depth[v])
if (depth[u]>depth[v])
u=P[u];
else
v=P[v];
if (u==v)
return u;
int l=15;
//while (str[l][u]!=str[l][v])
//l++;
//l--;
//u=str[l][u],v=str[l][v];
while (P[u]!=P[v] && l)
{
while (str[l][u]==str[l][v])
l--;
u=str[l][u],v=str[l][v];
}
return P[u];
}
int main()
{
fi>>n>>m;
for (int i=2; i<=n; i++)
{
fi>>P[i];
G[P[i]].push_back(i);
}
dfs(1);
precalc();
for (int i=1; i<=m; i++)
{
int u,v;
fi>>u>>v;
fo<<lca(u,v)<<"\n";
}
return 0;
}