Cod sursa(job #1568820)

Utilizator ArambasaVlad Arambasa Arambasa Data 14 ianuarie 2016 18:52:12
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

const int NMax = 100005;

int N,M;
vector<int> G[NMax];
int TT[20][NMax],Level[NMax];



void Read()
{
    fin>>N>>M;
    for(int i = 2; i<=N; i++)
        {
            fin>>TT[0][i];
            G[TT[0][i]].push_back(i);
        }

}


void DFS(int Nod)
{
    for(int i = 0 ; i < (int)G[Nod].size(); i++ )
        {
            int Vecin = G[Nod][i];
            Level[Vecin] = Level[Nod] + 1;
            DFS(Vecin);
        }
}

void Precalculate()
{
    for(int i = 1; (1<<i) <= N; i++)
        for(int j = 1; j<=N; j++)
            TT[i][j] = TT[i-1][TT[i-1][j]];
}

void SolveandPrint()
{
    while(M--)
    {
        int x,y;
        fin>>x>>y;

        if(Level[x]<Level[y])
            swap(x,y);

        while(Level[x]!=Level[y])
            x = TT[0][x];

        if(x == y)

            fout << x <<"\n";

        else
        {
            for(int k = log2(Level[x]); k>=0 ; k-- )
            {
                if(TT[k][x]!=TT[k][y])
                {
                    x = TT[k][x];
                    y = TT[k][y];
                }
            }

            fout << TT[0][x]<< "\n";
        }

    }
}

int main()
{
    Read();
    DFS(1);
    Precalculate();
    SolveandPrint();
    return 0;
}