Pagini recente » Cod sursa (job #967587) | Cod sursa (job #2022080) | Cod sursa (job #2205940) | Cod sursa (job #306082) | Cod sursa (job #2486175)
#include<bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
/// Aduc x si y la acelasi nivel
/// Urc simultan sa aflu LCA
const int NMax = 100000;
vector <int> G[NMax+5];
int Lvl[NMax+5], N, M, TT[NMax+5], A[20][NMax+5] ,lg[NMax+5];
void Read() {
in >> N >> M;
for (int i = 2; i <= N; i++) {
in >> TT[i];
G[TT[i]].push_back(i);
}
for (int i = 1; i <= N; i++)
A[0][i] = TT[i];
for (int i = 1; (1<<i) <= N; i++)
for (int j = 1; j <= N; j++)
A[i][j] = A[i-1][A[i-1][j]];
for(int i = 2; i <= N; i++)
lg[i] = lg[i/2] + 1;
}
void DFS(int Nod) {
for (auto Vecin : G[Nod])
{
Lvl[Vecin] = Lvl[Nod] + 1;
DFS(Vecin);
}
}
void LCA(int x,int y) {
if(Lvl[x] < Lvl[y])
swap(x,y);
while(Lvl[x] != Lvl[y]) {
int k = lg[Lvl[x] - Lvl[y]];
x = A[k][x];
}
if (x==y) {out << x << '\n'; return;}
for (int k = lg[Lvl[x]]; k >= 0; k--)
if(A[k][x] != A[k][y]) {
x = A[k][x];
y = A[k][y];
}
out << A[0][x] << '\n';
}
int main() {
Read();
DFS(1);
int x,y;
while(M--) {
in >> x >> y;
LCA(x,y);
}
}