Pagini recente » Cod sursa (job #834688) | Cod sursa (job #605224) | Cod sursa (job #750717) | Cod sursa (job #2394844) | Cod sursa (job #2030370)
#include<bits/stdc++.h>
using namespace std;
const int nmax=1e6+2;
pair<int,int> visited[nmax]; //indexul o sa fie elementul si valoarea o sa fie nivelul si tatal
vector<int> tr[nmax];
void dfs(int node,int nivel,int tata){
visited[node]=make_pair(nivel,tata);
int tataCurent=node;
int nivelCurent=nivel+1;
for(int i=0;i<tr[node].size();i++){
int nodeCurent=tr[node][i];
dfs(nodeCurent,nivelCurent,tataCurent);
}
}
int main(){
ifstream cin("lca.in");
ofstream fout("lca.out");
int n,m;
cin>>n>>m;
int root=1;
for(int i=2;i<=n;i++){
int x;
cin>>x;
tr[x].push_back(i);
}
dfs(1,1,0);
int ok=0;
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
int nivelX=visited[x].first;
int nivelY=visited[y].first;
if(nivelX<nivelY){
swap(x,y);
swap(nivelX,nivelY);
}
while(nivelX>nivelY){
ok=1;
x=visited[x].second;
nivelX=visited[x].first;
}
if(x==y){
fout<<x<<"\n";
continue;
}
//sunt pe acelasi nivel
int tataX=visited[x].second;
int tataY=visited[y].second;
while(tataX!=tataY){
x=tataX;
y=tataY;
tataX=visited[x].second;
tataY=visited[y].second;
}
fout<<tataX<<"\n";
}
return 0;
}