Pagini recente » Cod sursa (job #2678511) | Cod sursa (job #2152301) | Cod sursa (job #485159) | Cod sursa (job #1833297) | Cod sursa (job #2842020)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector<int> v[100002];
int aint[1000001],dp[300000],parc[100001],n,m,first[100001],rmq[300001][21];
int cat;
void dfs(int nod)
{
parc[nod]=1;
for(auto nod2 : v[nod])
if(parc[nod2]==0)
{
dp[nod2]=dp[nod]+1;
dfs(nod2);
}
}
void euler(int nod){
++cat;
rmq[cat][0]=nod;
first[nod]=cat;
parc[nod]=1;
for(auto nod2 : v[nod])
if(parc[nod2]==0)
{
euler(nod2);
++cat;
rmq[cat][0]=nod;
}
}
int main()
{
int i,j,x,a,b,l,r,k;
in>>n>>m;
for(i=2;i<=n;++i){
in>>x;
v[x].push_back(i);
}
dfs(1);
for(i=1;i<=n;++i)
parc[i]=0;
dp[0]=1e8;
euler(1);
for(j=1;(1<<j)<=2*n-1;++j)
for(i=1;i<=2*n-(1<<j);++i)
rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
for(i=1;i<=m;++i){
in>>a>>b;
l=min(first[a],first[b]);
r=max(first[a],first[b]);
k=log2(r-l+1);
out<<min(rmq[l][k],rmq[r-(1<<k)+1][k])<<'\n';
}
return 0;
}