Pagini recente » Cod sursa (job #268050) | Cod sursa (job #2774681) | Cod sursa (job #520478) | Cod sursa (job #2660207) | Cod sursa (job #3144660)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
const int Nmax = 100005;
int poz;
int euclid[Nmax];
pair<int, int> rmq[35][10 * Nmax];
vector<int> arbore[Nmax];
void dfs(int nod, int tata, int nivel){
if(euclid[nod] == 0){
euclid[nod] = poz;
}
rmq[0][poz].first = nivel;
rmq[0][poz].second = nod;
poz++;
for(int fiu : arbore[nod]){
if(fiu != tata){
dfs(fiu, nod, nivel + 1);
rmq[0][poz].first = nivel;
rmq[0][poz].second = nod;
poz++;
}
}
}
int main(){
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, x, a, b;
pair<int, int> p;
fin >> n >> m;
for(int i = 2; i <= n; i++){
fin >> x;
arbore[i].push_back(x);
arbore[x].push_back(i);
}
poz = 1;
dfs(1, 0, 0);
for(int len = 1; (1 << len) <= poz; len++){
for(int i = 1; i <= poz - (1 << len) + 1; i++){
rmq[len][i] = min(rmq[len - 1][i], rmq[len - 1][i + (1 << (len - 1))]);
}
}
while(m--){
fin >> a >> b;
a = euclid[a];
b = euclid[b];
x = log2(b - a + 1);
p = min(rmq[x][a], rmq[x][b - (1 << x) + 1]);
fout << p.second << '\n';
}
return 0;
}