Cod sursa(job #2565435)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 2 martie 2020 14:14:04
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>
#define DIMN 100010
using namespace std;
int elem;
int rmq[20][2*DIMN] , eul[2*DIMN] , first[DIMN] , nv[2*DIMN] , logg[2*DIMN];
vector <int> v[DIMN];
void dfs (int nod , int lvl){
    int i , vecin;
    eul[++elem] = nod;
    first[nod] = elem;
    nv[elem] = lvl;

    for (i=0;i<v[nod].size();i++){
        vecin = v[nod][i];
        dfs(vecin , lvl + 1);
        eul[++elem] = nod;
        nv[elem] = lvl;
    }

}

int query (int x, int y){
    int px , py , len;

    px = first[x];
    py = first[y];

    if (px > py)
        swap(px , py);

    len = py - px + 1;
    len = logg[len]; /// cea mai mare p2 <= len

    if (nv[ rmq[len][px] ] < nv[ rmq[len][py - (1 << len) + 1] ])
        return rmq[len][px];
    else return rmq[len][py - (1 << len) + 1];

}

int main()
{
    FILE *fin = fopen ("lca.in","r");
    FILE *fout = fopen ("lca.out","w");
    int n , q , x , i , powe , y;
    fscanf (fin,"%d%d",&n,&q);
    for (i=2;i<=n;i++){
        fscanf (fin,"%d",&x);
        v[x].push_back(i);
    }
    dfs (1 , 1);

    for (i = 2 ; i <= 2 * n ; i++)
        logg[i] = 1 + logg[i / 2];

    for (i = 1 ; i <= elem ; i++)
        rmq[0][i] = i;

    for (powe = 1 ; (1 << powe) <= elem ; powe++){
        for (i = 1 ; i + (1 << powe) - 1 <= elem ; i++){

            if (nv[ rmq[powe-1][i] ] < nv[ rmq[powe-1][i + (1 << (powe - 1) )] ])
                rmq[powe][i] = rmq[powe-1][i];
            else rmq[powe][i] = rmq[powe-1][i + (1 << (powe - 1) )];

        }
    }

    /// am fc rmq - ul , e ok sa faci query

    for (;q;q--){
        fscanf (fin,"%d%d",&x,&y);
        fprintf (fout,"%d\n" , eul[ query(x , y) ]);
    }

    return 0;
}