Cod sursa(job #2397902)

Utilizator cristibogdanPatrascu Cristian cristibogdan Data 4 aprilie 2019 21:11:45
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <cmath>
#include <vector>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,i,x,y,sq,viz[100005],tata[100005],tata_block[100005],adancime[100005],viz1[100005],Max;
vector <int> G[100005];

void dfs1(int nod, int d){
    viz1[nod] = 1;
    adancime[nod] = d;
    Max = max(Max,d);
    for(int i=0;i<G[nod].size();i++)
        if(viz1[G[nod][i]] == 0)
            dfs1(G[nod][i],d+1);
    }


void dfs(int nod, int db,int parinte_bloc){
    viz[nod] = 1;
    if(db > sq){
        db = 1;
        parinte_bloc = tata[nod];
    }
    tata_block[nod] = parinte_bloc;

    for(int i=0;i<G[nod].size();i++)
        if(viz[G[nod][i]] == 0)
            dfs(G[nod][i],db+1,parinte_bloc);
    }
int main()
{
    f>>n>>m;

    for(i=1;i<=n-1;i++)
    {
        f>>x;
        tata[i+1]=x;
        G[x].push_back(i+1);
        G[i+1].push_back(x);
    }
    dfs1(1,1);
    sq = sqrt(Max);
    dfs(1,1,0);

    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        while(tata_block[x]!=tata_block[y]){
            if(adancime[x]> adancime [y])
                x = tata_block[x];
            else
                y = tata_block[y];
        }
        while(x!=y){
            if(adancime[x]>adancime[y])
                x = tata[x];
            else
                y = tata[y];
        }
        g<<x<<'\n';

    }

    return 0;
}