Pagini recente » Cod sursa (job #1011934) | Cod sursa (job #1238266) | Cod sursa (job #2114627) | Cod sursa (job #582008) | Cod sursa (job #2409730)
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("lca.in");
ofstream out ("lca.out");
int n,m,k,x,y,putere,sx,sy;
int level[100005],euler[400005],strt[100005],p[25],a[400005];
struct str{
int val,poz;
}rmq[25][100005];
vector<int>v[100005];
void dfs (int nod, int nivel) {
level[nod] = nivel;
euler [++k] = nod;
for (int i = 0; i < v[nod].size(); i ++) {
int vecin = v[nod][i];
dfs (vecin,nivel+1);
euler[++k] = nod;
}
}
int main (void) {
in >> n >> m;
for (int i = 2; i <= n; i ++) {
in >> x;
v[x].push_back (i);
}
dfs (1,1);
for (int i = 1; i <= k; i ++) {
if (strt[euler[i]] == 0) {
strt[euler[i]] = i;
}
rmq[0][i].val = level[euler[i]];
rmq[0][i].poz = i;
}
p[0] = 1;
p[1] = 2;
for (int i = 2; i <= 25; i ++) {
p[i] = p[i-1] * p[i-1];
}
for (int i = 2; i <= k; i ++) {
a[i] = a[i/2] + 1;
}
for (int i = 1; i <= 25; i ++) {
for (int j = 1; j <= k-p[i-1]; j ++) {
if (rmq[i-1][j].val <= rmq[i-1][j+p[i-1]].val) {
rmq[i][j] = rmq[i-1][j];
}
else {
rmq[i][j] = rmq[i-1][j+p[i-1]];
}
}
}
for (int i = 1; i <= m; i ++) {
in >> x >> y;
sx = strt[x];
sy = strt[y];
if (sx > sy) swap (sx,sy);
putere = a[sy-sx+1];
if (rmq[putere][sx].val <= rmq[putere][sy-p[putere]+1].val) {
out << euler [rmq[putere][sx].poz] <<"\n";
}
else {
out << euler [rmq[putere][sy-p[putere]+1].poz] <<"\n";
}
}
return 0;
}