Pagini recente » Cod sursa (job #2764109) | Cod sursa (job #527634) | Cod sursa (job #884482) | Cod sursa (job #571097) | Cod sursa (job #2813005)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int DIM = 100005;
int n, q;
int level[DIM], stramos[DIM][17];
int up(int nod, int dist){
int p2 = 0;
while(dist != 0){
if(dist&1)
nod = stramos[nod][p2];
p2++;
dist >>= 1;
}
return nod;
}
int main (){
fin >> n >> q;
stramos[1][0] = level[1] = 1;
for(int i = 2; i <= n; i++){
fin>>stramos[i][0];
level[i] = level[ stramos[i][0] ] + 1;
}
/*
for(int i=1; i<=n; i++)
cout<<level[i]<<" ";
cout<<"\n";
*/
for(int j = 1; (1 << j) <= n; j++)
for(int i = 1; i <= n; i++)
stramos[i][j] = stramos[ stramos[i][j-1] ][j-1];
int x, sx, y, sy, st, md, dr, sol;
while(q--){
fin >> x >> y;
if(level[x] < level[y]) ///x mai sus decat y, atunci swap
swap(x, y);
//cout<<"("<<x<<", "<<y<<") -> ";
x = up(x, level[x] - level[y]); ///ac nivel
//cout<<"("<<x<<", "<<y<<")\n";
st = 0;
dr = level[y]-1;
while(st <= dr){
md = (dr - st) / 2 + st;
sx = up(x, md);
sy = up(y, md);
if(sx == sy){
sol = sx;
dr = md-1;
}else
st = md+1;
}
fout << sol << "\n";
}
return 0;
}