Cod sursa(job #2670976)

Utilizator razviii237Uzum Razvan razviii237 Data 11 noiembrie 2020 08:33:32
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#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;
}