Pagini recente » Cod sursa (job #1136321) | Cod sursa (job #1635308) | Cod sursa (job #604586) | Cod sursa (job #69579) | Cod sursa (job #3168756)
#include <fstream>
#include <vector>
using namespace std;
int n, q;
int lift[20][100005];
int depth[100005];
vector<int> fii[100005];
ifstream cin("lca.in");
ofstream cout("lca.out");
void dfs(int nod)
{
depth[nod] = depth[lift[0][nod]] + 1;
for(auto i : fii[nod])
dfs(i);
}
void build_lift()
{
for(int bit = 1; bit < 20; bit ++)
for(int j = 1; j <= n; j ++)
lift[bit][j] = lift[bit - 1][lift[bit - 1][j]];
}
int lca(int u, int v)
{
if(depth[u] > depth[v])
swap(u, v);
int bit = 19;
while(bit >= 0)
{
if(depth[v] - (1 << bit) >= depth[u])
v = lift[bit][v];
bit --;
}
if(u == v)
return v;
bit = 19;
while(bit >= 0)
{
if(lift[bit][u] != lift[bit][v])
v = lift[bit][v], u = lift[bit][u];
bit --;
}
return lift[0][v];
}
int main()
{
cin >> n >> q;
for(int i = 2; i <= n; i ++)
cin >> lift[0][i], fii[lift[0][i]].push_back(i);
build_lift();
dfs(1);
while(q --)
{
int u, v;
cin >> u >> v;
cout << lca(u, v) << '\n';
}
}