Cod sursa(job #1506972)

Utilizator robx12lnLinca Robert robx12ln Data 21 octombrie 2015 09:46:46
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<fstream>
#define DIM 100005
#include<vector>
#include<cstring>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int x[DIM*2+1];
vector<int> v[DIM];
int nr,i,n,m,t[DIM],ap[DIM],nivel[DIM];
void drum(int nod,int niv){
    x[++nr]=nod;
    nivel[nod]=niv;
    if(ap[nod]==0)
        ap[nod]=nr;
    for(int i=0;i<v[nod].size();i++){
        drum(v[nod][i],niv+1);
        x[++nr]=nod;
        nivel[nod]=niv;
        if(ap[nod]==0)
            ap[nod]=nr;
    }
}
int P[DIM*2+1],k,a,b;
pair<int,int> D[20][DIM*2+1];
int main(){
    fin>>n>>m;
    for(i=1;i<n;i++){
        fin>>t[i];
        v[ t[i] ].push_back(i+1);
    }
    drum(1,0);
    for(i=1;i<=nr;i++){
        D[0][i].first=nivel[x[i]];
        D[0][i].second=x[i];
    }

    for(k=1;(1<<k)<=nr;k++){
        for(i=1;i<=nr-(1<<k-1);i++){
            D[k][i]=D[k-1][i];
            if(D[k][i].first > D[k-1][i+(1<<k-1)].first){
                D[k][i]=D[k-1][i+(1<<k-1)];
            }
        }
    }
    P[1]=0;
    for(i=2;i<=nr;i++){
        P[i]=P[i/2]+1;
    }
    for(i=1;i<=m;i++){
        fin>>a>>b;
        a=ap[a];
        b=ap[b];
        int p=P[b-a+1];
        if(D[p][a].first<=D[p][b-(1<<p)+1].first){
            fout<<D[p][a].second<<"\n";
        }else{
            fout<<D[p][b-(1<<p)+1].second<<"\n";
        }
    }
    return 0;
}