Cod sursa(job #1468339)

Utilizator bogdanmarin69Bogdan Marin bogdanmarin69 Data 5 august 2015 19:41:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>
using namespace std;
const int MAX = 100001, MAXX = 200001;
int poz[MAX], n, m, niv[MAX], eul[20][MAXX], ne, lg[MAXX];
vector <int> arb[MAX];
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int nod, int lvl){
    eul[0][++ne] = nod;
    niv[nod] = lvl;
    poz[nod] = ne;
    for(unsigned i=0; i<arb[nod].size(); i++){
        dfs(arb[nod][i], lvl+1);
        eul[0][++ne] = nod;
    }
}
void builrmq(){
    for(int i=1; i<=lg[ne]; i++)
        for(int j=1; j<=ne+1-(1<<i); j++)
            niv[eul[i-1][j]]<niv[eul[i-1][j+(1<<(i-1))]]?eul[i][j] = eul[i-1][j]:eul[i][j] = eul[i-1][j+(1<<(i-1))];
}
int main()
{
    fin>>n>>m;
    for(int i=2; i<=n; i++){
        int x;
        fin>>x;
        arb[x].push_back(i);
    }
    dfs(1, 0);
    for(int i=2; i<=ne; i++) lg[i] = 1 + lg[i/2];
    builrmq();
    for(int i=1; i<=m; i++){
        int x, y;
        fin>>x>>y;
        if(poz[x]>poz[y]){
            int aux = x;
            x = y;
            y = aux;
        }
        int lin = lg[poz[y]-poz[x]+1];

        if(niv[eul[lin][poz[x]]]<niv[eul[lin][poz[y]+1-(1<<lin)]])
            fout<<eul[lin][poz[x]]<<'\n';
        else
            fout<<eul[lin][poz[y]+1-(1<<lin)]<<'\n';
    }
    return 0;
}