Cod sursa(job #1772789)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 7 octombrie 2016 00:13:17
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
# include <fstream>
# include <vector>
# define DIM 100010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> Lista[DIM];
int m[19][DIM*2],p2[20],Marcat[DIM],niv[DIM],p[DIM*2],rp[DIM*2],pi[2*DIM];
int n,m1,s,i,j,x,y,d,st,dr,vst,vdr,val,l,aux;
void dfs(int nc,int nivc){
    niv[nc]=nivc;
    s++;
    Marcat[nc]=s;
    p[s]=nivc;
    rp[s]=nc;
    for(int i=0;i<Lista[nc].size();i++){
        int nv=Lista[nc][i];
        if(!Marcat[nv]){
            dfs(nv,nivc+1);
            s++;
            p[s]=nivc;
            rp[s]=nc;
        }
    }
}
int main () {
    fin>>n>>m1;
    for(i=1;i<n;i++){
        fin>>x;
        Lista[x].push_back(i+1);
    }
    dfs(1,0);
    p2[0]=1;
    for(i=1;2*p2[i-1]<=s;i++)
        p2[i]=2*p2[i-1];
    d=i-1;
    for(i=2;i<=s;i++)
        pi[i]=pi[i/2]+1;
    for(i=1;i<=s;i++)
        m[0][i]=rp[i];
    for(i=1;i<=d;i++)
        for(j=1;j<=s-p2[i]+1;j++){
            st=j;
            dr=j+p2[i-1];
            vst=m[i-1][st];
            vdr=m[i-1][dr];
            if(niv[vst]<niv[vdr])
                m[i][j]=vst;
            else
                m[i][j]=vdr;
        }
    for(i=1;i<=m1;i++){
        fin>>x>>y;
        st=Marcat[x];
        dr=Marcat[y];
        if(st>dr){
            aux=st;
            st=dr;
            dr=aux;
        }
        l=dr-st+1;
        val=pi[l];
        vst=m[val][st];
        vdr=m[val][dr-p2[val]+1];
        if(niv[vst]<niv[vdr])
            fout<<vst<<"\n";
        else
            fout<<vdr<<"\n";
    }
    return 0;
}