Pagini recente » Cod sursa (job #1669621) | Cod sursa (job #1731522) | Cod sursa (job #1216721) | Cod sursa (job #573793) | Cod sursa (job #3183250)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout("lca.out");
int n,m,i,k,x,y,j,l,t,viz[100001],P[400001];
vector <int> V[100001];
struct elem
{
int e,h;
}E[400001],D[20][400001];
void dfs(int x,int h)
{
viz[x]=1;
E[++k]={x,h};
for(int j=0;j<V[x].size();j++)
{
int vecin=V[x][j];
if(!viz[vecin])
{
dfs(vecin,h+1);
E[++k]={x,h};
}
}
}
elem minim(elem x,elem y)
{
if(x.h>y.h)
{
elem z=y;
return z;
}
else
{
elem z=x;
return z;
}
}
int main()
{
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>t;
V[t].push_back(i);
V[i].push_back(t);
}
dfs(1,0);
for(i=1;i<=k;i++)
D[0][i]={i,E[i].h};
for(l=1;(1<<l)<=k;l++)
{
for(i=1;i<=k;i++)
{
D[l][i]=D[l-1][i];
j=i+(1<<(l-1));
if(j<=k&&D[l][i].h>D[l-1][j].h)
D[l][i]=D[l-1][j];
}
}
P[1]=0;
for(i=2;i<=k;i++)
P[i]=P[i/2]+1;
for(i=1;i<=m;i++)
{
fin>>x>>y;
l=P[y-x+1];
elem z=minim(D[l][x],D[l][y-(1<<l)+1]);
fout<<E[z.e].e<<"\n";
}
return 0;
}