Cod sursa(job #2278562)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 8 noiembrie 2018 11:07:20
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define DIMN 100010
#define LOGN 20
#define DIM_EULER 2*DIMN
#define INF 2000000000
using namespace std;
int elem;
int eul[DIM_EULER],niv[DIMN],pp[DIMN],logg[DIM_EULER];
pair <int,int> rmq[LOGN][DIM_EULER];
vector <int> v[DIMN];
void dfs (int nod){
    int i,vecin;
    pp[nod]=elem+1;
    eul[++elem]=nod;
    for (i=0;i<v[nod].size();i++){
        vecin=v[nod][i];
        niv[vecin]=1+niv[nod];
        dfs (vecin);
        eul[++elem]=nod;
    }

}
int qry (int st,int dr){
    int l;
    pair <int,int> sol;
    if (st>dr)
        swap(st,dr);
    l=logg[dr-st+1];
    sol=min(rmq[l][st],rmq[l][dr-(1<<l)+1]);
    return sol.second;
}
int main()
{
    FILE *fin=fopen ("lca.in","r");
    FILE *fout=fopen ("lca.out","w");
    int n,q,i,x,p2,y;
    fscanf (fin,"%d%d",&n,&q);
    for (i=2;i<=n;i++){
        fscanf (fin,"%d",&x);
        v[x].push_back(i);
    }
    niv[1]=1;
    dfs (1);
    for (i=1;i<=elem;i++)
        rmq[0][i]=make_pair(niv[eul[i]],i);
    for (i=2;i<=elem;i++)
        logg[i]=logg[i/2]+1;
    for (p2=1;(1<<p2)<=elem;p2++){
        for (i=1;i<=elem;i++){
            rmq[p2][i]=rmq[p2-1][i];
            if (i+(1<<(p2-1))<=elem && rmq[p2][i].first>rmq[p2-1][i+(1<<(p2-1))].first)
                rmq[p2][i]=rmq[p2-1][i+(1<<(p2-1))];
        }
    }
    for (;q;q--){
        fscanf (fin,"%d%d",&x,&y);
        fprintf (fout,"%d\n",eul[qry(pp[x],pp[y])]);
    }
    return 0;
}