Pagini recente » Cod sursa (job #464096) | Cod sursa (job #703615) | Cod sursa (job #1363994) | Cod sursa (job #2207408) | Cod sursa (job #2806144)
#include <fstream>
#include <vector>
#define N 100002
#include <fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> graph[N];
int rmq[20][3 * N], log[3 * N], nr;
int niv[N], first[N];
bool viz[N];
void eul(int nod)
{
rmq[0][++nr] = nod;
first[nod] = nr;
viz[nod] = 1;
for (int i = 0;i < graph[nod].size();++i)
{
int vee = graph[nod][i];
if (!viz[vee])
{
niv[vee] = niv[nod] + 1;
eul(vee);
rmq[0][++nr] = nod;
}
}
}
int main()
{
int n, m, x;
f >> n >> m;
for (int i = 1;i < n;++i)
{
f >> x;
graph[x].push_back(i + 1);
}
eul(1);
log[0] = -1;
for (int i = 1;i <= nr;++i) log[i] = 1 + log[i / 2];
int p = 1;
for (int i = 1;i <= log[nr];++i)
{
for (int j = 1;j + p <= nr;++j)
{
int n1 = rmq[i - 1][j], n2 = rmq[i - 1][j + p];
if (niv[n1] > niv[n2]) rmq[i][j] = n2;
else rmq[i][j] = n1;
}
p *= 2;
}
int a, b, dif, lin, sol;
while (m--)
{
f >> a >> b;
a = first[a];
b = first[b];
if (a > b) swap(a, b);
dif = b - a + 1;
lin = log[dif];
p = (1 << lin);
int n1 = rmq[lin][a], n2 = rmq[lin][b - p + 1];
if (niv[n1] > niv[n2]) sol = n2;
else sol = n1;
g << sol << '\n';
}
f.close();
g.close();
return 0;
}