Pagini recente » Cod sursa (job #1734438) | Cod sursa (job #205155) | Cod sursa (job #1031269) | Cod sursa (job #2401350) | Cod sursa (job #1726606)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int h = 200;
int tata[100005], tataie[100005];
int niv[100005], x, y, m, n, i;
vector <int> ls[100005];
void df(int nod, int n1, int Niv) {
int i;
tataie[nod] = n1;
niv[nod] = Niv;
if (Niv%h == 0)
n1 = nod;
for (i = 0; i < ls[nod].size(); i++)
df(ls[nod][i], n1, Niv+1);
}
int main() {
f >> n >> m;
for (i = 2; i <= n; i++) {
f >> tata[i];
ls[tata[i]].push_back(i);
}
df(1, 1, 0);
while (m) {
f >> x >> y;
while (tataie[x] != tataie[y])
if (niv[x] > niv[y])
x = tataie[x];
else y = tataie[y];
while (x != y)
if (niv[x] > niv[y])
x = tata[x];
else y = tata[y];
g << x << '\n';
m--;
}
return 0;
}