Pagini recente » Cod sursa (job #2319898) | Cod sursa (job #1372334) | Cod sursa (job #1355840) | Cod sursa (job #2196669) | Cod sursa (job #3293849)
#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 - 1;
}
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;
int p = x;
for (int i = LOG; i >= 0; i--)
if (IsAscensor(up[i][p], y) == false)
p = up[i][p];
return up[0][p];
}
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, 0);
while (Q--)
{
fin >> i >> j;
fout << LCA(i, j) << "\n";
}
return 0;
return 0;
}