Cod sursa(job #1506239)

Utilizator AndyCatrunaCatruna Andy AndyCatruna Data 20 octombrie 2015 11:35:33
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#define dim1 100005
#define dim2 200005
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int d[20][dim2],p[dim2],i,j,n,m,x,nr,first[dim2],NIV[dim2],A,B,a,b,P,S[dim2];
vector <int>v[dim2];
void dfs(int nod,int niv){
    nr++;
    S[nr]=nod;
    NIV[nr]=niv;
    first[nod]=nr;
    for(int i=0;i<v[nod].size();i++){
        dfs(v[nod][i],niv+1);
        nr++;
        S[nr]=nod;
        NIV[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++){
        p[i]=p[i/2]+1;
    }
    for(i=1;i<=nr;i++){
        d[0][i]=i;
    }
    for(i=1;(1<<i)<=nr;i++){
        for(j=1;j<=nr-(1<<i);j++){
            d[i][j]=d[i-1][j];
            if(NIV[d[i-1][j]]>NIV[d[i-1][j+(1<<(i-1))]]){
                d[i][j]=d[i-1][j+(1<<(i-1))];
            }
        }
    }
    for(i=1;i<=m;i++){
        fin>>a>>b;
        A=first[a];
        B=first[b];
        if(A>B){
            swap(A,B);
        }
        P=p[B-A+1];
        fout<<S[min(d[P][A],d[P][B-(1<<P)+1])]<<"\n";
    }

    return 0;
}