Pagini recente » Cod sursa (job #3270471) | Cod sursa (job #2400417) | Cod sursa (job #3262627) | Cod sursa (job #2762957) | Cod sursa (job #3004402)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N = 1e5 + 5;
int n, q;
int dep[N], up[20][N];
vector <int> g[N];
void dfs(int nod, int depev, int par)
{
dep[nod] = depev;
for(auto it:g[nod])
{
if(it != par)
dfs(it, depev + 1, nod);
}
}
int depca(int p, int q)
{
if(dep[p] < dep[q])
swap(p, q);
int diff = dep[p] - dep[q];
for(int i = 17; i >= 0; i--)
if(diff & (1 << i)) p = up[i][p];
if(p == q) return p;
for(int i = 17; i >= 0; i--)
{
if(up[i][p] != up[i][q])
{
p = up[i][p];
q = up[i][q];
}
}
return up[0][p];
}
int main()
{
in >> n >> q;
for(int i = 2; i <= n; i++)
{
int x;
in >> x;
g[x].push_back(i);
up[0][i] = x;
}
up[0][1] = 0;
dfs(1, 0, -1);
for(int i = 1; 1 << i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
up[i][j] = up[i - 1][ up[i - 1][j] ];
}
}
while(q--)
{
int x,y;
in >> x >> y;
out << depca(x, y) << '\n';
}
return 0;
}