Pagini recente » Cod sursa (job #2142524) | Cod sursa (job #2400935) | Cod sursa (job #1077719) | Cod sursa (job #1430337) | Cod sursa (job #1226439)
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
vector<int> M[2],adj[100010];
int k,first[100010],t[1800010][20];
void dfs(int n){
// cout<<n<<" "<< M[0].size()<<'\n';
first[n] = M[0].size();
for(unsigned int i = 0; i < adj[n].size(); i++){
M[0].push_back(n);
M[1].push_back(k++);
dfs(adj[n][i]);
}
M[0].push_back(n);
M[1].push_back(k--);
}
void insert(int j, int i){
adj[j].push_back(i);
}
void process_rmq(){
for(int i = 0; i < (int)M[0].size(); i++)
t[i][0] = i;
for(int j = 1; (1 << j) <= (int)M[0].size(); j++){
for(int i = 0; i + (1 << j) - 1 < (int)M[0].size(); i++)
t[i][j] = M[1][t[i][j - 1]] < M[1][t[i + (1 << (j - 1))][j - 1]] ? t[i][j - 1] : t[i + (1 << (j - 1))][j - 1];
}
}
void lca(int i, int j){
int ci = min(first[i],first[j]),cj = max(first[i],first[j]);
i = ci,j = cj;
int k = (int)(log10((double)(j - i + 1)) / log10(2.0));
int rez = M[1][t[i][k]] < M[1][t[j - (1 << k) + 1][k]] ? M[0][t[i][k]] : M[0][t[j - (1 << k) + 1][k]];
printf("%d\n", rez );
}
int main(){
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int n,q;
scanf("%d%d",&n,&q);
for(int i = 2; i <= n; i++){
int a;
scanf("%d",&a);
insert(a,i);
}
dfs(1);
process_rmq();
for(int i = 0; i < q; i++){
int a,b;
scanf("%d%d",&a,&b);
lca(a, b);
}
return 0;
}