Pagini recente » Cod sursa (job #2176426) | Cod sursa (job #2007327) | Cod sursa (job #1256731) | Cod sursa (job #2254154) | Cod sursa (job #915725)
Cod sursa(job #915725)
#include<cstdio>
#include<vector>
#define nmax 100001
using namespace std;
struct etc{
int node,level;
}eulerv[nmax*100];
vector<int> list[nmax];
int father[nmax],k,n,dist[nmax],poz[nmax];
void euler(int nod){
int i;
if(!list[nod].size()){
eulerv[++k].node=nod;
if(!poz[nod])
poz[nod]=k;
}
else{
eulerv[++k].node=nod;
if(!poz[nod]) poz[nod]=k;
for(i=0;i<list[nod].size();++i){
euler(list[nod][i]);
eulerv[++k].node=nod;
}
}
}
int search(int x,int y){
int i,min=nmax,minpos=0;
if(poz[x]<=poz[y]){
for(i=poz[x];i<=poz[y];++i)
if(min>eulerv[i].level){
min=eulerv[i].level;
minpos=i;
}
}
else
for(i=poz[y];i<=poz[x];++i)
if(min>eulerv[i].level){
min=eulerv[i].level;
minpos=i;
}
return eulerv[minpos].node;
};
int main(){
int i,no_qr,x,y;
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&no_qr);
for(i=2;i<=n;++i){
scanf("%d",father+i);
list[father[i]].push_back(i);
}
for(i=2;i<=n;++i)
dist[i]=dist[father[i]]+1;
euler(1);
for(i=1;i<=k;++i)
eulerv[i].level=dist[eulerv[i].node];
/*for(i=1;i<=k;++i)
printf("%d ",eulerv[i].level);
printf("\n");
for(i=1;i<=k;++i)
printf("%d ",eulerv[i].node);*/
for(i=1;i<=no_qr;++i){
scanf("%d%d",&x,&y);
printf("%d\n",search(x,y));
}
return 0;
}