Cod sursa(job #2395421)

Utilizator marinaoprOprea Marina marinaopr Data 2 aprilie 2019 15:05:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#include <vector>

#define h 256
#define NMAX 100005

using namespace std;

FILE *fin = fopen("lca.in", "r");
FILE *fout = fopen("lca.out", "w");

vector <int> fii[NMAX];
int n,m,tata[NMAX],Lev[NMAX],Vitreg[NMAX],x,y,i;

void dfs(int nod, int Tvit, int lev)
{
    Lev[nod] = lev;
    Vitreg[nod] = Tvit;

    if(lev%h == 0)
        Tvit = nod;

    for(vector<int>:: iterator it=fii[nod].begin(); it!=fii[nod].end(); ++it)
        dfs(*it, Tvit, lev+1);

}

int lca(int x, int y)
{
    while(Vitreg[x] != Vitreg[y])
        if(Lev[x] > Lev[y])
            x = Vitreg[x];
        else
            y = Vitreg[y];

    while(x != y)
        if(Lev[x] > Lev[y])
            x = tata[x];
        else
            y = tata[y];

    return x;
}

int main()
{
    fscanf(fin, "%d%d", &n,&m);

    for(i=2; i<=n; ++i)
    {
        fscanf(fin, "%d", &tata[i]);
        fii[tata[i]].push_back(i);
    }

    dfs(1,0,0);

    for(i=1; i<=m; ++i)
    {
        fscanf(fin, "%d%d", &x,&y);
        fprintf(fout, "%d\n", lca(x, y));
    }

    fclose(fin);
    fclose(fout);
    return 0;
}