Pagini recente » Cod sursa (job #2942969) | Cod sursa (job #1501479) | Cod sursa (job #292588) | Cod sursa (job #2199915) | Cod sursa (job #2922194)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout("lca.out");
const int NMAX = 1e5 + 4;
int N, Q;
vector < int > G[NMAX];
int Next[20][NMAX];
int Level[NMAX];
void DFS(int node, int daddy, int level)
{
Level[node] = level;
Next[0][node] = daddy;
for(int i = 1; (1 << i) <= N; ++i)
Next[i][node] = Next[i - 1][Next[i - 1][node]];
for(auto it: G[node])
if(it != daddy)
DFS(it, node, level + 1);
}
int Query(int a, int b)
{
if(Level[b] > Level[a])
swap(a, b);
int delta = Level[a] - Level[b];
for(int i = 0; (1 << i) <= delta; ++i)
if((delta >> i) & 1)
a = Next[i][a];
if(a == b)
return a;
for(int i = 20; i >= 0; --i)
if(Next[i][a] != Next[i][b])
a = Next[i][a], b = Next[i][b];
return Next[0][a];
}
void Solve()
{
fin >> N >> Q;
for(int i = 2; i <= N; ++i) {
int a;
fin >> a;
G[a].push_back(i);
G[i].push_back(a);
}
DFS(1, 0, 0);
for(int i = 1; i <= Q; ++i) {
int x, y;
fin >> x >> y;
fout << Query(x, y) << '\n';
}
}
int main()
{
Solve();
return 0;
}