Cod sursa(job #1502094)

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