Pagini recente » Cod sursa (job #2901629) | Cod sursa (job #236897) | Cod sursa (job #1009996) | Cod sursa (job #1304004) | Cod sursa (job #2922338)
#include<bits/stdc++.h>
#define int long long
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,t[100005],nivel[100005],w[23][100005];
vector<int>v[100005];
void dfs(int x)
{
nivel[1]=0;
for(auto it:v[x])
{
nivel[it]=nivel[x]+1;
dfs(it);
}
}
signed main()
{
int i,x,y,j,bit,nr,nr1;
f>>n>>m;
for(i=2; i<=n; i++)
{
f>>t[i];
v[t[i]].push_back(i);
w[0][i]=t[i];
}
dfs(1);
for(i=1; i<=20; i++)
{
for(j=1; j<=n; j++)
w[i][j]=w[i-1][w[i-1][j]];//aici precalc
}
for(i=1; i<=m; i++)
{
f>>x>>y; //aduc la acelasi nivel
if(nivel[x]>nivel[y])
{
swap(x,y);
}
int dif=nivel[y]-nivel[x];
for(bit=19; bit>=0; bit--)
{
if((1<<bit)<=dif)
{
dif-=(1<<bit);
y=w[bit][y];
}
}
if(x==y)
g<<x<<'\n';//daca sunt deja pe lca
else//daca nu caut
{
for(bit=19; bit>=0; bit--)
{
if(w[bit][x] && w[bit][x]!=w[bit][y])
{
x=w[bit][x];
y=w[bit][y];
}
}
g<<w[0][x]<<'\n';
}
}
return 0;
}