Pagini recente » Cod sursa (job #329300) | Cod sursa (job #1987696) | Cod sursa (job #204666) | Cod sursa (job #1964307) | Cod sursa (job #528888)
Cod sursa(job #528888)
#include <cstdio>
#include <vector>
using namespace std;
#define file_in "lca.in"
#define file_out "lca.out"
#define nmax 101000
int N,M,x,y;
int i,T[nmax];
vector<int> G[nmax];
int Lev[nmax];
int T2[nmax];
int Lca(int x, int y){
while(T2[x]!=T2[y])
if (Lev[x]>Lev[y])
x=T2[x];
else
y=T2[y];
while(x!=y)
if (Lev[x]>Lev[y])
x=T[x];
else
y=T[y];
return x;
}
void dfs(int nod, int t2, int niv){
T2[nod]=t2;
Lev[nod]=niv;
if (niv%200==0)
t2=nod;
vector<int> :: iterator it;
for (it=G[nod].begin();it!=G[nod].end();++it)
dfs(*it,t2,niv+1);
}
int main(){
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d", &N, &M);
for (i=2;i<=N;++i){
scanf("%d", &T[i]);
G[T[i]].push_back(i);
}
dfs(1,0,0);
while(M--){
scanf("%d %d", &x, &y);
printf("%d\n", Lca(x,y));
}
return 0;
}