Cod sursa(job #2506290)

Utilizator HannaLieb Hanna Hanna Data 7 decembrie 2019 19:35:57
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
/** Lowest Common Ancestor **/
#include <fstream>
#include <vector>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define csp first
#define sz second

ifstream cin("lca.in");
ofstream cout("lca.out");

int n,m,i,a,b,r[200005][22];
vector<pair<int,int> >v;

struct adat
{
    int os,s,e;
    vector<int>lesz;
    bool l;
};
vector<adat>x;

void melysegi(int i, int szint)
{
    x[i].s=szint;
    v.push_back({i,szint});
    x[i].e=v.size()-1;
    x[i].l=true;

    for(auto e : x[i].lesz)
    if(x[e].l==false)
    {
        melysegi(e,szint+1);
        v.push_back({i,szint});
    }
}

void elkeszit()
{
    int n=v.size(),j;
    int l;
    for(i=0;i<n;++i) r[i][0]=i;

    for(j=1;(1<<j)<=n;++j)
    for(i=0;i<n;++i)
    {
        l=min(n-1,i+(1<<(j-1)));
        if(v[r[i][j-1]].sz<v[r[l][j-1]].sz)
        r[i][j]=r[i][j-1];
        else r[i][j]=r[l][j-1];
    }
}

int rmq(int a, int b)
{
    int k,l,m;
    k=log2(b-a+1);
    if(v[r[a][k]]<=v[r[b-(1<<k)+1][k]])
        return r[a][k];
    else return  r[b-(1<<k)+1][k];
}

int main()
{
    cin>>n>>m;
    x.resize(n+1);
    for(i=2;i<=n;++i)
    {
        cin>>x[i].os;
        x[x[i].os].lesz.push_back(i);
    }

    melysegi(1,0);
    elkeszit();

    for(i=1;i<=m;++i)
    {
        cin>>a>>b;
        if(x[a].e<x[b].e) cout<<v[rmq(x[a].e,x[b].e)].csp<<"\n";
        else cout<<v[rmq(x[b].e,x[a].e)].csp<<"\n";
    }
    return 0;
}