Pagini recente » Cod sursa (job #3267206) | Cod sursa (job #501339) | Cod sursa (job #576244) | Cod sursa (job #1111830) | Cod sursa (job #2870727)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const string filename = "lca";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
const int maxN = 100000;
int n, q, ind, depth[maxN + 5], poz[maxN + 5], e[2 * maxN + 5], rmq[20][2 * maxN + 5], log2[2 * maxN + 5];
vector <int> G[maxN + 5];
void dfs(int nod, int d)
{
e[++ind] = nod;
poz[nod] = ind;
depth[nod] = d;
for(int vecin : G[nod])
{
dfs(vecin, d + 1);
e[++ind] = nod;
}
}
bool cmp(int a, int b)
{
if(depth[a] < depth[b])
return 1;
return 0;
}
void calc_rmq()
{
for(int i = 2; i <= ind; i++)
log2[i] = log2[i / 2] + 1;
for(int i = 1; i <= ind; i++)
rmq[0][i] = e[i];
for(int j = 1; (1 << j) <= ind; j++)
for(int i = 1; i + (1 << (j - 1)) <= ind; i++)
rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))], cmp);
}
int lca(int a, int b)
{
int st, dr, log, len, aux;
st = min(poz[a], poz[b]);
dr = max(poz[a], poz[b]);
len = dr - st + 1;
log = log2[len];
aux = min(rmq[log][st], rmq[log][dr - (1 << log) + 1], cmp);
return aux;
}
int main()
{
fin >> n >> q;
for(int i = 2; i <= n; i++)
{
int p;
fin >> p;
G[p].push_back(i);
}
dfs(1, 1);
calc_rmq();
for(int i = 1; i <= q; i++)
{
int x, y;
fin >> x >> y;
fout << lca(x, y) << '\n';
}
return 0;
}