Pagini recente » Cod sursa (job #132732) | Cod sursa (job #641580) | Cod sursa (job #888894) | Cod sursa (job #201687) | Cod sursa (job #1279471)
#include<bits/stdc++.h>
using namespace std;
struct cell
{
int minimal,val;
};
ifstream fin("lca.in");
ofstream fout("lca.out");
const int NMAX=100005;
int n,m;
int euler[2*NMAX],nivel[2*NMAX],pozstart[NMAX];
int logaritm[2*NMAX];
cell dp[2*NMAX][20];
vector<int>v[NMAX];
inline void Euler(int x,int niv)
{
euler[++euler[0]]=x;nivel[x]=niv;
pozstart[x]=euler[0];
for (vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
{
Euler(*it,niv+1);
euler[++euler[0]]=x;
}
}
inline void RMQ()
{
int i,j,aux;
logaritm[2]=1;
for (i=3;i<2*NMAX;i++) logaritm[i]=logaritm[i>>1]+1;
for (i=1;i<=euler[0];i++)
{
dp[i][0].minimal=nivel[euler[i]];
dp[i][0].val=euler[i];
}
for (j=1;j<=logaritm[euler[0]];j++)
{
aux=euler[0]-(1<<j)+1;
for (i=1;i<=aux;i++)
{
dp[i][j]=dp[i][j-1];
if (dp[i+(1<<(j-1))][j-1].minimal<dp[i][j].minimal)
dp[i][j]=dp[i+(1<<(j-1))][j-1];
}
}
}
int main()
{
int i,x,y,dif,sol;
fin>>n>>m;
for (i=1;i<n;i++)
{
fin>>x;
v[x].push_back(i+1);
}
Euler(1,1);
RMQ();
for (i=1;i<=m;i++)
{
fin>>x>>y;
if (pozstart[x]>pozstart[y]) swap(x,y);
dif=pozstart[y]-pozstart[x]+1;
sol=dp[pozstart[x]][logaritm[dif]].minimal;
if (dp[pozstart[y]-(1<<logaritm[dif])+1][logaritm[dif]].minimal<dp[pozstart[x]][logaritm[dif]].minimal)
fout<<dp[pozstart[y]-(1<<logaritm[dif])+1][logaritm[dif]].val<<"\n";
else fout<<dp[pozstart[x]][logaritm[dif]].val<<"\n";
}
return 0;
}