Pagini recente » Cod sursa (job #442190) | Cod sursa (job #846227) | Cod sursa (job #3031010) | Cod sursa (job #2706801) | Cod sursa (job #2723237)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> euler, v[100100];
int indice,h[100100],first_appear[100100];
void parcurgere_euler(int nod, int adancime_nod)
{
h[nod]=adancime_nod;
indice++;
if(first_appear[nod]==0)first_appear[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,adancime_nod+1);
indice++;
euler.push_back(nod);
}
}
int n,m,x,k,N,y,i,dp[500100][20];
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
v[x].push_back(i);
}
parcurgere_euler(1,0);
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++)
{
if(h[dp[i][k-1]] < h[dp[i+(1<<(k-1))][k-1]])dp[i][k]=dp[i][k-1];
else dp[i][k]=dp[i+(1<<(k-1))][k-1];
}
}
for(i=1;i<=m;i++)
{
f>>x>>y;
x=first_appear[x];
y=first_appear[y];
if(x>y)swap(x,y);
k=log2(y-x+1);
if(h[dp[x][k]] < h[dp[y-(1<<k)+1][k]])g<<dp[x][k]<<'\n';
else g<<dp[y-(1<<k)+1][k]<<'\n';
}
return 0;
}