Pagini recente » Cod sursa (job #577078) | Cod sursa (job #1504056)
#include <fstream>
#include <vector>
#define DIM 200005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int N,K,M;
int L[DIM],H[DIM],Lg[DIM],First[DIM];
vector <int> v[2*DIM];
int Rmq[30][DIM];
void dfs(int x,int niv){
H[++K] = x;
L[K] = niv;
First[x] = K;
for(int i=0;i<v[x].size();i++){
dfs(v[x][i], niv+1);
H[++K] = x;
L[K] = niv;
}
}
void RMQ(){
for(int i=2;i<=K;i++)
Lg[i] = Lg[i/2] + 1;
for(int i=1;i<=K;i++)
Rmq[0][i] = i;
for(int i=1;(1 << i) <= K;i ++)
for(int j=1;j<=K - (1 << i); j ++){
int l = 1 << (i-1);
Rmq[i][j] = Rmq[i-1][j];
if(L[Rmq[i][j]] > L[Rmq[i-1][j+l]])
Rmq[i][j] = Rmq[i-1][j+l];
}
}
int lca(int x, int y){
int sol;
int a = First[x], b = First[y];
if(a>b)
swap(a,b);
int l = Lg[b-a+1];
sol = Rmq[l][a];
if(L[sol] > L[Rmq[l][b - (1 << l) + 1]])
sol = Rmq[l][b - (1 << l) + 1];
return H[sol];
}
int main(){
fin >> N >> M;
for(int i=2;i<=N;i++){
int x;
fin >> x;
v[x].push_back(i);
}
dfs(1,0);
RMQ();
while(M--){
int x,y;
fin >> x >> y;
fout << lca(x, y) << '\n';
}
fin.close();fout.close();
return 0;
}