Pagini recente » Cod sursa (job #2922658) | Cod sursa (job #704612) | Cod sursa (job #2916033) | Cod sursa (job #1427992) | Cod sursa (job #2950990)
#include <fstream>
#include <vector>
#define pb push_back
using namespace std;
using vi=vector<int>;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int N=1e5+2;
const int L=18;
int niv[N],up[N][L];
int n,m,x,y,i;
vi adj[N];
void dfs(int nod,int tata){
for(int i=1; i<=L; i++)
up[nod][i]=up[up[nod][i-1]][i-1];
for(auto i:adj[nod])
if(i!=tata)
{
niv[i]=niv[nod]+1;
up[i][0]=nod;
dfs(i,nod);
}
}
int lca(int x,int y){
if(niv[x]<niv[y])
swap(x,y);
for(int i=L; i>=0; i--)
if(up[x][i] && niv[up[x][i]]>=niv[y])
x=up[x][i];
if(x==y)
return x;
for(int i=L; i>=0; i--)
if(up[x][i] && up[y][i] && up[x][i]!=up[y][i])
{
x=up[x][i];
y=up[y][i];
}
return up[x][0];
}
int main()
{
fin>>n>>m;
for(i=2; i<=n; i++)
{
fin>>x;
adj[x].pb(i);
adj[i].pb(x);
}
dfs(1,0);
for(i=1; i<=m; i++)
{
fin>>x>>y;
fout<<lca(x,y)<<'\n';
}
}