Cod sursa(job #2496636)

Utilizator RadianElevenAdrian Ariotn RadianEleven Data 21 noiembrie 2019 11:34:27
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
int n,m;
int t;
int euler[100005];
int niv[100005];
int poz[100005], log[100005], rmq[21][100005];
int rmp[21][100005];
vector<int> muchii[100005];
int siz=0;
void oilar(int nod, int lvl)
{
    siz++;
    niv[siz]=lvl;
    euler[siz]=nod;
    poz[nod]=siz;
    for(int i=0;i<muchii[nod].size();i++)
    {
        oilar(muchii[nod].at(i), lvl+1);
        siz++;
        niv[siz]=lvl;
        euler[siz]=nod;

    }
}
int main()
{
    f>>n>>m;
    for(int i=2;i<=n;++i)
    {
        f>>t;
        muchii[t].push_back(i);
    }
    oilar(1,1);
    for(int i=2; i<=siz+1; i*=2) log[i]++;
    for(int i=1; i<=siz+1; i++) log[i]+=log[i-1];
    for(int i=1;i<=siz+1;i++)
    {

        rmq[0][i]=i;
    }
    for(int h=1;(1<<h)<=siz;++h)
    {
        for(int i=1;i<=siz-(1<<h)+1;++i)
        {
            if(niv[rmq[h-1][i]]>niv[rmq[h-1][i+(1<<(h-1))]])
            rmq[h][i]=rmq[h-1][i+(1<<(h-1))];
            else rmq[h][i]=rmq[h-1][i];
        }
    }

    for(int i=1;i<=m;++i)
    {
        int x,y;
        f>>x>>y;
        x=poz[x];
        y=poz[y];
       // cout<<x<<" "<<y<<"\n";
        if(x>y)
            swap(x,y);
        int h=log[y-x+1];
        if(niv[rmq[h][x] ] > niv[rmq[h][y-(1<<h)+1]])
        g<<euler[rmq[h][y-(1<<h)+1]]<<"\n";
        else g<<euler[rmq[h][x]]<<"\n";
    }
    return 0;
}