Cod sursa(job #3149789)

Utilizator tudor_costinCostin Tudor tudor_costin Data 12 septembrie 2023 17:22:41
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int Nmax=500005,Mmax=100005;
int depth[Nmax];
int poz[Mmax];
int rmq[Nmax][20];
vector<int> v[Nmax];
vector<int> e,l;
int log(int x)
{
    int pow=1,nr=0;
    while(x>=pow)
    {
        pow=pow*2;
        nr++;
    }
    return (nr-1);
}
int rminq(int i,int j)
{
    if(i>j)
    {
        int aux=j;
        j=i;
        i=aux;
    }
    int x=log(j-i+1);
    int fhalf=l[rmq[i][x]],shalf=l[rmq[j-(1<<x)+1][x]];
    if(fhalf<=shalf) return rmq[i][x];
    else return rmq[j-(1<<x)][x];
}
void euler(int i)
{
    e.push_back(i);
    poz[i]=e.size();
    for(int j=0; j<v[i].size(); j++)
    {
        euler(v[i][j]);
        e.push_back(i);
    }
    return;
}
int main()
{
    int n,m,x;
    fin>>n>>m;
    for(int i=1; i<n; i++)
    {
        fin>>x;
        v[x].push_back(i+1);
        depth[i+1]=depth[x]+1;
    }
    euler(1);
    l.push_back(0);
    for(int i=0; i<e.size(); i++)
    {
        l.push_back(depth[e[i]]);
    }
    for(int i=1; i<=e.size(); i++)
    {
        rmq[i][0]=i;
    }
    for(int p=1; p<=log(e.size()); p++)
    {
        for(int i=1; i<=e.size(); i++)
        {
            int fhalf=l[rmq[i][p-1]],shalf=l[rmq[i+(1<<(p-1))][p-1]];
            if(fhalf<=shalf) rmq[i][p]=rmq[i][p-1];
            else rmq[i][p]=rmq[i+(1<<(p-1))][p-1];
        }
    }
    int y;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
       /// cout<<rminq(poz[x],poz[y])<<' '<<poz[x]<<' '<<poz[y]<<'\n';
        int lca=e[rminq(poz[x],poz[y])-1];
        fout<<lca<<'\n';
    }
    return 0;
}