Cod sursa(job #2278536)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 8 noiembrie 2018 10:22:14
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <algorithm>
#define DIMN 100010
#define LOGN 17
#define DIM_EULER 4*DIMN
#define INF 2000000000
using namespace std;
int elem;
int eul[DIM_EULER],niv[DIMN],pp[DIMN];
pair <int,int> rmq[LOGN][DIMN];
vector <int> v[DIMN];
void dfs (int nod){
    int i,vecin;
    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 p2,sol,psol;
    if (st>dr)
        swap(st,dr);
    p2=0;
    while ((1<<p2)<=(dr-st+1))
        p2++;
    p2--;
    sol=INF;
    psol=0;
    while (p2>=0){
        if (st+(1<<p2)-1<=dr){ // e ok
            if (sol>rmq[p2][st].first){
                sol=rmq[p2][st].first;
                psol=rmq[p2][st].second;
            }
            st=st+(1<<p2)-1;
        }
        p2--;
    }
    return psol;
}
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++){
        if (!pp[eul[i]])
            pp[eul[i]]=i;
    }
    for (i=1;i<=elem;i++)
        rmq[0][i]=make_pair(niv[eul[i]],i);
    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;
}