Pagini recente » Cod sursa (job #2270524) | Cod sursa (job #2568707) | Cod sursa (job #2124647) | Cod sursa (job #1444412) | Cod sursa (job #2453866)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int euler[4 * MAXN], nivel[MAXN], apar[MAXN], rmq[32][4 * MAXN], lg[4 * MAXN];
vector<int> graf[MAXN];
int niv = 1, lim;
void parcurgere(int nod, int niv){
nivel[nod] = niv;
euler[++lim] = nod;
apar[nod] = lim;
for(auto x:graf[nod]){
parcurgere(x, niv + 1);
euler[++lim] = nod;
}
}
int main()
{
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m;
fin >> n >> m;
for(int i = 2; i <= n; ++i){
int x;
fin >> x;
graf[x].push_back(i);
}
parcurgere(1, 1);
for(int i = 2; i <= lim; ++i) lg[i] = lg[i / 2] + 1;
for(int i = 1; i <= lim; ++i) rmq[0][i] = euler[i];
for(int i = 1; (1 << i) <= lim; ++i){
for(int j = 1; j <= lim - (1 << i) + 1; ++j){
if(nivel[rmq[i - 1][j]] <= nivel[rmq[i - 1][j + (1 << (i - 1))]]) rmq[i][j] = rmq[i - 1][j];
else rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
}
}
while(m){
int x, y;
fin >> x >> y;
x = apar[x];
y = apar[y];
if(x > y) swap(x, y);
int logdif = lg[y - x + 1];
if(nivel[rmq[logdif][x]] < nivel[rmq[logdif][y - (1 << logdif) + 1]]) fout << rmq[logdif][x];
else fout << rmq[logdif][y - (1 << logdif) + 1];
fout << "\n";
m--;
}
return 0;
}