Pagini recente » Cod sursa (job #2562362) | Cod sursa (job #527494) | Cod sursa (job #2651828) | Cod sursa (job #2666082) | Cod sursa (job #3293855)
#include <bits/stdc++.h>
using namespace std;
//aemi
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, Q, timp;
int LOG;
bitset<100005> viz;
int in[100005], out[100005], up[20][100005];
vector<int> L[100005];
void DFS(int k, int tata)
{
viz[k] = 1;
in[k] = ++timp;
up[0][k] = tata;
for (int i = 1; i <= LOG; i++)
up[i][k] = up[i - 1][up[i - 1][k]];
for (int i : L[k])
if (viz[i] == 0)
DFS(i, k);
out[k] = ++timp;
}
bool IsAscensor(int x, int y)
{
return (in[x] <= in[y] && out[y] <= out[x]);
}
int LCA(int x, int y)
{
if (IsAscensor(x, y)) return x;
if (IsAscensor(y, x)) return y;
for (int i = LOG; i >= 0; i--)
if (IsAscensor(up[i][x], y) == false)
x = up[i][x];
return up[0][x];
}
int main()
{
int i, j;
fin >> n >> Q;
LOG = ceil(log2(n));
for (i = 2; i <= n; i++)
{
fin >> j;
L[j].push_back(i);
}
DFS(1, 1);
while (Q--)
{
fin >> i >> j;
fout << LCA(i, j) << "\n";
}
return 0;
}