Pagini recente » Cod sursa (job #1240804) | Cod sursa (job #2180928) | Cod sursa (job #3240135) | Cod sursa (job #702796) | Cod sursa (job #3306324)
#include <fstream>
#include <vector>
using namespace std;
const int Nmax = 100001;
int n, m, F[Nmax], dp[Nmax][22], depth[Nmax], pow2[22], log2[Nmax];
vector<int> L[Nmax];
void RMQ(){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= 20; j++){
dp[i][j] = dp[dp[i][j-1]][j-1];
}
}
}
void dfs(int node){
for(int son : L[node]){
depth[son] = depth[node] + 1;
dfs(son);
}
}
void preCalc(){
pow2[0] = 1;
for(int i = 1; i <= 20; i++){
pow2[i] = pow2[i-1]*2;
}
log2[1] = 0;
for(int i = 2; i <= Nmax; i++){
log2[i] = log2[i/2] + 1;
}
}
int main()
{
ifstream fin("lca.in");
ofstream fout("lca.out");
fin >> n >> m;
depth[1] = 0;
for(int i = 2; i <= n; i++){
int aux;
fin >> aux;
dp[i][0] = aux;
L[aux].push_back(i);
}
RMQ();
dfs(1);
preCalc();
for(int j = 1; j <= m; j++){
int u, v;
fin >> u >> v;
if(depth[u] > depth[v]){
swap(u, v);
}
int deficit = depth[v] - depth[u];
while(deficit > 0){
int p = log2[deficit];
v = dp[v][p];
deficit -= pow2[p];
}
if(u == v){
fout << u << "\n";
}
else{
for(int i = 20; i >= 0; i--){
if(dp[u][i] != dp[v][i]){
u = dp[u][i];
v = dp[v][i];
}
}
u = dp[u][0];
v = dp[v][0];
fout << u << "\n";
}
}
return 0;
}