Pagini recente » Cod sursa (job #1154061) | Cod sursa (job #2300002) | Cod sursa (job #964808) | Cod sursa (job #167917) | Cod sursa (job #3318680)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int rmq[100001][20];
int depth[100001];
vector<int> v[100001];
void dfs(int node,int d)
{
depth[node]=d;
d++;
for(auto it:v[node])
{
dfs(it,d);
}
d--;
}
int LCA(int u,int v)
{
if(depth[u]<depth[v])
{
swap(u,v);
}
for(int i=19;i>=0;i--)
{
if(depth[u]-(1<<i)>=depth[v])
{
u=rmq[u][i];
}
}
if(u==v) return u;
for(int i=19;i>=0;i--)
{
if(rmq[u][i] && rmq[u][i]!=rmq[v][i])
{
u=rmq[u][i];
v=rmq[v][i];
}
}
return rmq[u][0];
}
int main()
{
int n,m,x;
fin>>n>>m;
for(int i=1;i<n;i++)
{
int j=i+1;
fin>>x;
rmq[j][0]=x;
v[x].push_back(j);
}
for(int j=1;j<20;j++)
{
for(int i=1;i<=n;i++)
{
rmq[i][j]=rmq[rmq[i-1][j]][j-1];
}
}
dfs(1,1);
int a,b;
for(int i=1;i<=m;i++)
{
fin>>a>>b;
fout<<LCA(a,b)<<'\n';
}
return 0;
}