Pagini recente » Cod sursa (job #213645) | Cod sursa (job #343863) | Cod sursa (job #1942556) | Cod sursa (job #2365551) | Cod sursa (job #1506972)
#include<fstream>
#define DIM 100005
#include<vector>
#include<cstring>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int x[DIM*2+1];
vector<int> v[DIM];
int nr,i,n,m,t[DIM],ap[DIM],nivel[DIM];
void drum(int nod,int niv){
x[++nr]=nod;
nivel[nod]=niv;
if(ap[nod]==0)
ap[nod]=nr;
for(int i=0;i<v[nod].size();i++){
drum(v[nod][i],niv+1);
x[++nr]=nod;
nivel[nod]=niv;
if(ap[nod]==0)
ap[nod]=nr;
}
}
int P[DIM*2+1],k,a,b;
pair<int,int> D[20][DIM*2+1];
int main(){
fin>>n>>m;
for(i=1;i<n;i++){
fin>>t[i];
v[ t[i] ].push_back(i+1);
}
drum(1,0);
for(i=1;i<=nr;i++){
D[0][i].first=nivel[x[i]];
D[0][i].second=x[i];
}
for(k=1;(1<<k)<=nr;k++){
for(i=1;i<=nr-(1<<k-1);i++){
D[k][i]=D[k-1][i];
if(D[k][i].first > D[k-1][i+(1<<k-1)].first){
D[k][i]=D[k-1][i+(1<<k-1)];
}
}
}
P[1]=0;
for(i=2;i<=nr;i++){
P[i]=P[i/2]+1;
}
for(i=1;i<=m;i++){
fin>>a>>b;
a=ap[a];
b=ap[b];
int p=P[b-a+1];
if(D[p][a].first<=D[p][b-(1<<p)+1].first){
fout<<D[p][a].second<<"\n";
}else{
fout<<D[p][b-(1<<p)+1].second<<"\n";
}
}
return 0;
}