Cod sursa(job #2153098)

Utilizator malina2109Malina Diaconescu malina2109 Data 5 martie 2018 22:42:16
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int L[100001];
vector<int> v;
int first[100001];
int lg[100001],D[21][100001];
vector<int> graf[100001];
int n,m;
void euler(int node,int level)
{

    L[v.size()]=level;
    first[node]=v.size();
    v.push_back(node);
    for(int i=0; i<graf[node].size(); i++)
    {
        euler(graf[node][i],level+1);
        L[v.size()]=level;
        v.push_back(node);

    }
}
void process()
{
    lg[1]=0;
    for(int i=2; i<=v.size(); i++)
        lg[i]=lg[i/2]+1;
    for(int i=1; i<=v.size(); i++)
        D[0][i]=i;
    for(int i=1;(1<<i)<v.size();i++)
        for(int j=1; j<=v.size()-(1<<i); j++)
        {
            int l=(1<<(i-1));
            D[i][j]=D[i-1][j];
            if(L[D[i-1][j+l]]<L[D[i][j]]) D[i][j]=D[i-1][j+l];
        }
    for(int i=1; i<=m; i++)
    {
        int x,y,a,b;
        f>>a>>b;
        x=first[a];y=first[b];
        if(x>y) swap(x,y);
      int diff=y-x+1;
      int l=lg[diff];
      int sol=D[l][x];
int      sh=diff-(1<<l);
      if(L[sol]>L[D[l][x+sh]])
        sol=D[l][x+sh];
      g<<v[sol]<<"\n";
    }
}
int main()
{

    f>>n>>m;
    for(int i=1; i<n; i++)
    {
        int aux;
        f>>aux;
        graf[aux].push_back(i+1);
    }
    euler(1,0);
    process();
    return 0;
}