Cod sursa(job #1501848)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 13 octombrie 2015 21:34:49
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<fstream>
#include<vector>
#define DIM 100005
using namespace std;
int n, m, i, x, y, nr, p, minim, j;
vector<int> v[DIM];
int d[2 * DIM], niv[DIM], niv2[2 * DIM], first[DIM], b[2 * DIM];
int a[18][DIM], A[18][DIM];
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int nod){
    nr++;
    d[nr] = nod;
    niv2[nr] = niv[nod];
    first[nod] = nr;
    for(int i = 0; i < v[nod].size(); i++){
        int vecin = v[nod][i];
        niv[vecin] = niv[nod] + 1;
        dfs(vecin);
        nr++;
        d[nr] = nod;
        niv2[nr] = niv[nod];
    }
}
int main(){
    fin>> n >> m;
    for(i = 2; i <= n; i++){
        fin>> x;
        v[x].push_back(i);
    }
    niv[1] = 1;
    dfs(1);
    for(i = 2; i <= nr; i++){
        b[i] = b[i / 2] + 1;
    }
    for(i = 1; i <= nr; i++){
        a[0][i] = niv2[i];
        A[0][i] = d[i];
    }
    for(j = 1; j <= b[nr]; j++){
        for(i = 1; i <= nr; i++){
            a[j][i] = a[j - 1][i];
            A[j][i] = A[j - 1][i];
            if(i + (1 << (j - 1)) <= nr && a[j - 1][i + (1 << (j - 1) )] < a[j][i]){
                a[j][i] = a[j - 1][i + (1 << (j - 1) )];
                A[j][i] = A[j - 1][i + (1 << (j - 1) )];
            }
        }
    }
    for(i = 1; i <= m; i++){
        fin>> x >> y;
        x = first[x];
        y = first[y];
        if(x > y){
            swap(x, y);
        }
        p = b[y - x + 1];
        minim = min(a[p][x], a[p][y - (1 << p) + 1]);
        if(a[p][x] < a[p][y - (1 << p) + 1]){
            minim = A[p][x];
        }
        else{
            minim = A[p][y - (1 << p) + 1];
        }
        fout<< minim <<"\n";
    }
    return 0;
}