Pagini recente » Borderou de evaluare (job #862007) | Cod sursa (job #729587) | Cod sursa (job #3195177) | Cod sursa (job #1703194) | Cod sursa (job #2409674)
#include<fstream>
#include<vector>
#define DIM 100005
using namespace std;
int n, i, ii, x, y, q, nr;
int a[18][2 * DIM], b[2 * DIM], frst[DIM], niv[DIM];
vector<int> v[DIM];
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int nod){
a[0][++nr] = nod;
frst[nod] = nr;
for(int i = 0; i < v[nod].size(); i++){
niv[ v[nod][i] ] = 1 + niv[nod];
dfs(v[nod][i]);
a[0][++nr] = nod;
}
}
int lca(int x, int y){
if(x > y){
swap(x, y);
}
int p = b[y - x + 1];
if(niv[ a[p][x] ] < niv[ a[p][y - (1 << p) + 1] ]){
return a[p][x];
}
else{
return a[p][y - (1 << p) + 1];
}
}
int main(){
fin>> n >> q;
for(i = 2; i <= n; i++){
fin>> x;
v[x].push_back(i);
}
dfs(1);
for(i = 2; i <= nr; i++){
b[i] = b[i / 2] + 1;
}
for(ii = 1; (1 << ii) <= nr; ii++){
for(i = 1; i <= nr - (1 << ii) + 1; i++){
a[ii][i] = a[ii - 1][ i + (1 << (ii - 1) ) ];
if(niv[ a[ii][i] ] > niv[ a[ii - 1][i] ]){
a[ii][i] = a[ii - 1][i];
}
}
}
for(; q; q--){
fin>> x >> y;
fout<< lca(frst[x], frst[y]) <<"\n";
}
return 0;
}