Cod sursa(job #2332470)

Utilizator vladsirbu23Vlad Sirbu vladsirbu23 Data 30 ianuarie 2019 19:33:40
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> v[100010];
int n,M,nivel[100010],k,m[20][200020],log[200020],N,e,poz[100010],dif;
void dfs(int nod,int grad)
{
    k++;
    m[1][k]=nod;
    poz[nod]=k;
    nivel[nod]=grad;
    for(auto it:v[nod])
    {
        dfs(it,grad+1);
        k++;
        m[1][k]=nod;
    }
}
int main()
{
    int i,j,val,x,y;
    fin>>n>>M;
    for(i=2; i<=n; i++)
    {
        fin>>val;
        v[val].push_back(i);
    }
    dfs(1,1);
    log[1]=0;
    for(i=2;i<=2*n-1;i++)
        log[i]=log[i/2]+1;
    N=log[2*n-1];
    e=2*n-1;
    for(i=2;i<=N;i++)
    {
        for(j=1;j<=e+1-(1<<(i-1));j++)
        {
            if(nivel[m[i-1][j]]>nivel[m[i-1][j+(1<<(i-2))]])
                m[i][j]=m[i-1][j+(1<<(i-2))];
            else
                m[i][j]=m[i-1][j];
        }
    }
    for(i=1;i<=M;i++)
    {
        fin>>x>>y;
        if(poz[x]>poz[y])
            swap(x,y);
        dif=poz[y]-poz[x];
        dif=log[dif];
        if(nivel[m[dif+1][poz[x]]]>nivel[m[dif+1][poz[y]+1-(1<<dif)]])
            fout<<m[dif+1][poz[y]+1-(1<<dif)]<<'\n';
        else
            fout<<m[dif+1][poz[x]]<<'\n';

    }



}