Cod sursa(job #2373809)

Utilizator VNohaiNohai Vlad-Auras VNohai Data 7 martie 2019 15:24:03
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;

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

#define NMAX 100001

int n, m, p;
int ve[2*NMAX+10];

vector <int> v[NMAX];
int etaj[NMAX], etaje[2*NMAX+10];


void citire()
{
    fin>>n>>m;
    for(int i=2; i<=n; i++)
    {
    int x;
    fin>>x;
    v[x].push_back(i);
    etaj[i]=etaj[x]+1;
    }
}


void euler(int k)
{
    p++; ve[p]=k; etaje[p]=etaj[k];
    for(int i=0; i<v[k].size(); i++)
    {
    euler(v[k][i]);
    p++; ve[p]=k;
    etaje[p]=etaj[k];
    }
}

int Find(int nr)
{
    int poz=1;
    while(nr!=ve[poz])
        poz++;
    return poz;
}

void rezolva()
{
    int x, y;
    int fx, fy;
    fin>>x>>y;
    fx=Find(x);
    fy=Find(y);
    //fout<<fx<<" "<<fy<<'\n';
    int _min=n+5;
    int val=0;
    for(int i=min(fx, fy); i<=max(fx, fy); i++)
    {
    if(_min>etaje[i]) _min=etaje[i], val=i;
    }
    fout<<ve[val]<<'\n';
}

int main()
{
    citire();
    euler(1);
    /*for(int i=1; i<=p; i++)
    fout<<ve[i]<<" ";
    fout<<'\n';
    for(int i=1; i<=p; i++)
    fout<<etaje[i]<<" ";*/
    for(int i=1; i<=m; i++)
    rezolva();
    return 0;
}