Pagini recente » Cod sursa (job #3327611) | Cod sursa (job #2957223) | Diferente pentru concursuri-informatica intre reviziile 39 si 7 | Cod sursa (job #2097956) | Cod sursa (job #3341529)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define NMax 100005
#define LMax 18
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> vecini[NMax];
bitset<NMax> v;
int n, m;
int e[NMax*2], level[NMax*2], first[NMax], lg[NMax], cnt;
int rmq[LMax+1][2*NMax];
void dfs(int nod, int l) {
e[++cnt] = nod;
level[cnt] = l;
if(!v[nod]) {
v[nod] = 1;
first[nod] = cnt;
}
for(auto child : vecini[nod]) {
dfs(child, l+1);
e[++cnt] = nod;
level[cnt] = l;
}
}
int main() {
fin >> n >> m;
lg[1] = 0;
for(int i=2; i<=2*n; i++)
lg[i] = lg[i/2]+1;
for(int i=2; i<=n; i++) {
int x;
fin >> x;
vecini[x].push_back(i);
}
cnt = 0;
dfs(1, 0);
for(int i=1; i<=2*n-1; i++)
rmq[0][i] = i;
for(int j=1; (1<<j) <= 2*n-1; j++) {
for(int i=1; i + (1<<j) -1 <= 2*n-1; i++) {
int a = rmq[j-1][i];
int b = rmq[j-1][i + (1<<(j-1))];
rmq[j][i] = (level[a] <= level[b] ? a : b);
}
}
for(int i=1; i<=m; i++) {
int x, y;
fin >> x >> y;
x = first[x];
y = first[y];
if(x > y) swap(x, y);
int len = y - x + 1;
int k = lg[len];
int a = rmq[k][x];
int b = rmq[k][y - (1<<k) + 1];
int ind = (level[a] <= level[b] ? a : b);
fout << e[ind] << "\n";
}
}