Pagini recente » Cod sursa (job #1267311) | Cod sursa (job #2662825) | Cod sursa (job #2864411) | Cod sursa (job #2537522) | Cod sursa (job #2570793)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> euler,v[100100];
int indice,poz[100100],H[100100];
void parcurgere_euler(int nod)
{
indice++;
if(poz[nod]==0)poz[nod]=indice;
euler.push_back(nod);
for(int i=0;i<v[nod].size();i++)
{
int vecin=v[nod][i];
H[vecin]=H[nod]+1;
parcurgere_euler(vecin);
indice++;
if(poz[nod]==0)poz[nod]=indice;
euler.push_back(nod);
}
}
int n,m,i,x,N,k,sol1,sol2,K,a,b,p1,p2,dp[2*100100][20];
int main()
{
f>>n>>m;
for(i=1;i<=n-1;i++)
{
f>>x;
v[x].push_back(i+1);
}
H[1]=1;
parcurgere_euler(1);
N=euler.size();
for(i=1;i<=N;i++)dp[i][0]=euler[i-1];
for(k=1;(1<<k)<=N;k++)
{
for(i=1;i+(1<<k)-1<=N;i++)
{
sol1=dp[i][k-1];
sol2=dp[i+(1<<(k-1))][k-1];
if(H[sol1]<H[sol2])dp[i][k]=sol1;
else dp[i][k]=sol2;
}
}
for(i=1;i<=m;i++)
{
f>>a>>b;
p1=poz[a];
p2=poz[b];
if(p1>p2)swap(p1,p2);
K=log2(p2-p1+1);
sol1=dp[p1][K];
sol2=dp[p2-(1<<K)+1][K];
if(H[sol1]<H[sol2])g<<sol1<<'\n';
else g<<sol2<<'\n';
}
return 0;
}