Pagini recente » Cod sursa (job #2944145) | Cod sursa (job #3160487) | Cod sursa (job #1785147) | Cod sursa (job #210772) | Cod sursa (job #1377052)
#include<fstream>
#include<vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int Nmax = 100001;
vector<int> G[Nmax];
int T[Nmax],sm[21][Nmax];
int L[Nmax];
int N,M;
int lca(int x,int y){
if(L[x]>L[y]) swap(x,y);
int h=L[y]-L[x];
for(int k=0;(1<<k)<=h;k++) if((1<<k)&h) y=sm[k][y];
if(x==y) return x;
int pas=20;
while(pas>=0){
if(sm[pas][x]!=sm[pas][y]){
x=sm[pas][x];
y=sm[pas][y];
}
pas--;
}
return T[x];
}
void dfs(int x,int l){
L[x]=l;
sm[0][x]=T[x];
for(int k=1;sm[k-1][x];k++) sm[k][x]=sm[k-1][sm[k-1][x]];
for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it) if(!L[*it]) dfs(*it,l+1);
}
int main(){
in>>N>>M;
for(int i=2;i<=N;i++){
in>>T[i];
G[T[i]].push_back(i);
}
dfs(1,1);
int x,y;
while(M--){
in>>x>>y;
out<<lca(x,y)<<'\n';
}
return 0;
}