Pagini recente » Cod sursa (job #1766166) | Cod sursa (job #328682) | Cod sursa (job #1459907) | Cod sursa (job #2726242) | Cod sursa (job #1807443)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int N, Q;
vector<int> log, E, H, FirstPos, aux;
vector< vector<int> > M, G;
void Read();
void Preprocessing();
void Solve();
int Query(const int &a, const int &b);
void Euler(int node, int h);
int main()
{
Read();
Preprocessing();
Solve();
return 0;
}
void Solve() {
int a, b;
while(Q--) {
scanf("%d%d", &a, &b);
cout << Query(min(FirstPos[a], FirstPos[b]), max(FirstPos[a], FirstPos[b])) << '\n';
}
}
int Query(const int &a, const int &b) {
int k = log[b - a + 1];
if(H[ M[a][k] ] < H[ M[b - (1 << k) + 1][k] ] )
return M[a][k];
else
return M[b - (1 << k) + 1][k];
}
void Preprocessing() {
H.assign(N+2, 0);
FirstPos.assign(N+2, 0);
Euler(1, 0);
log.assign(2 * E.size() + 1, 0);
for(int i = 2; i <= 2 * E.size() + 1; i++)
log[i] = log[i / 2] + 1;
int maxLog = log[E.size() - 1];
aux.assign(maxLog + 2, 0);
M.assign(2 * E.size() + 1, aux);
for(int i = 0; i < E.size(); i++)
M[i][0] = E[i];
for(int k = 1; k <= maxLog ; k++)
for(int i = 0; i < E.size(); i++)
if(H[ M[i][k - 1] ] < H[ M[i + (1 << (k - 1) )][k - 1] ])
M[i][k] = M[i][k - 1];
else
M[i][k] = M[i + (1 << (k - 1))][k - 1];
}
void Euler(int node, int h) {
E.push_back(node);
H[node] = h;
FirstPos[node] = E.size() - 1;
for(int i = 0; i < G[node].size(); i++) {
Euler(G[node][i], h + 1);
E.push_back(node);
}
}
void Read() {
freopen("lca.in", "rt", stdin);
freopen("lca.out", "wt", stdout);
scanf("%d%d", &N, &Q);
G.assign(N + 2, vector<int>());
int f;
for(int i = 2; i <= N; i++) {
scanf("%d", &f);
G[f].push_back(i);
}
}