Pagini recente » Cod sursa (job #2952146) | Cod sursa (job #2202591) | Cod sursa (job #1079294) | Cod sursa (job #1502953) | Cod sursa (job #2275384)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N=100001;
const int L=18;
vector<int>f[N];
int n,m,ne,e[2*N],poz[N],nivel[N],root,log2[2*N],r[L][N];
void dfs(int x)
{
e[++ne]=x;
poz[x]=ne;
for(auto y:f[x])
{
nivel[y]=1+nivel[x];
dfs(y);
e[++ne]=x;
}
}
int main()
{
in>>n>>m;
int x,st,dr,sol,k;
for(int i=2;i<=2*(n+1);i++)
log2[i]=1+log2[i/2];
for(int i=2;i<=n;i++)
{
in>>x;
f[x].push_back(i);
}
dfs(1);
for(int j=1;j<=ne;j++)
r[0][j]=e[j];
for(int i=1;i<=log2[ne];i++)
for(int j=1;j<=ne;j++)
{
st=r[i-1][j-(1<<(i-1))];
dr=r[i-1][j];
if(nivel[st]<nivel[dr])
r[i][j]=st;
else
r[i][j]=dr;
}
for(int i=1;i<=m;i++)
{
in>>st>>dr;
st=poz[st];
dr=poz[dr];
k=log2[dr-st-1];
//sol=min(r[k][st+(1<<k)],r[k][dr]);
st=r[k][st+(1<<k)];
dr=r[k][dr];
if(nivel[st]<nivel[dr])
sol=st;
else
sol=dr;
out<<sol<<'\n';
}
return 0;
}