Pagini recente » Cod sursa (job #3224693) | Cod sursa (job #1506581) | Cod sursa (job #1443516) | Cod sursa (job #1472206) | Cod sursa (job #2670976)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int maxn = 1e5+5;
int n, m, qs, x, y;
vector <int> son[maxn];
int dad[maxn];
int imat[maxn];
int v[maxn], k, pos[maxn];
class arboreint {
private:
int n;
int v[4 * maxn];
int qa, qb;
int ans;
public:
int update(int nod, int st, int dr, int a[]) {
int mid = (st + dr) / 2;
if(st == dr) {
return v[nod] = a[st];
}
return v[nod] = min(update(nod * 2, st, mid, a),
update(nod * 2 + 1, mid + 1, dr, a));
}
void gen(int asize, int a[]) {
n = asize;
update(1, 1, asize, a);
}
void query(int nod, int st, int dr) {
if(st > dr) { return; }
int mid = (st + dr) / 2;
if(st >= qa && dr <= qb) {
ans = min(ans, v[nod]);
return;
}
if(qb > mid) {
query(nod * 2 + 1, mid + 1, dr);
}
if(qa <= mid) {
query(nod * 2, st, mid);
}
}
int query(int st, int dr) {
if(st > dr) { swap(st, dr); }
qa = st; qb = dr;
ans = 1 << 30;
query(1, 1, n);
return ans;
}
};
arboreint arbint;
void lcaprecalc() {
x = 1;
while(x != 0) {
v[++k] = x;
pos[x] = k;
if(imat[x] + 1 <= son[x].size()) {
imat[x] ++;
x = son[x][ imat[x] - 1 ];
} else {
x = dad[x];
}
}
}
/*
int lca(int x, int y) {
}
*/
#define debug 1
int main()
{
int i;
f >> n >> m;
for(i = 2; i <= n; i ++) {
f >> x;
son[x].push_back(i);
dad[i] = x;
}
lcaprecalc();
arbint.gen(k, v);
#if debug
for(i = 1; i <= k; i ++) {
g << v[i] << ' ';
} g << "\n\n";
#endif // debug
//f >> qs;
for(i = 1; i <= m; i ++) {
f >> x >> y;
//g << lca(x, y) << '\n';
g << arbint.query(pos[x], pos[y]) << '\n';
}
f.close(); g.close();
return 0;
}