Cod sursa(job #2657647)

Utilizator DavidAA007Apostol David DavidAA007 Data 11 octombrie 2020 13:27:07
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int G[100005],t,l,r,i,n,x,y,rmq[20][400005],first[100005];
int f[100005],list[400005],nivel[100005],puteri[20],lg[400005],nr;
vector<int> m[10005];
void dfs(int nod)
{
    int ind;
    f[nod]=1;
    list[++nr]=nod;
    first[nod]=nr;
    for(ind=0;ind<m[nod].size();ind++)
        if(f[m[nod][ind]]==0)
        {
            nivel[m[nod][ind]]=nivel[nod]+1;
            dfs(m[nod][ind]);
            list[++nr]=nod;
        }
}
int main()
{
    fin>>n>>t;
    puteri[0]=1;
    for(i=1;i<=19;i++)
        puteri[i]=puteri[i-1]*2;
    lg[1]=0;
    for(i=2;i<=2*n;i++)
        lg[i]=lg[i/2]+1;
    //fout<<lg[19]<<"\n";
    for(i=2;i<=n;i++)
    {
        fin>>x;
        G[i]=x;
        m[x].push_back(i);
    }
    dfs(1);
    for(i=1;i<=nr;i++)
        rmq[0][i]=list[i];
    for(i=1;i<=19;i++)
    {
        for(int j=1;j<=nr;j++)
        {
            x=rmq[i-1][j];
            y=rmq[i-1][j+puteri[i-1]];
            if(nivel[x]<=nivel[y])
                rmq[i][j]=x;
            else
                rmq[i][j]=y;
        }
    }
    //for(i=1;i<=n;i++)
      //  fout<<first[i]<<" ";
    while(t--)
    {
        fin>>l>>r;
        l=first[l];
        r=first[r];
        if(l>=r)
            swap(l,r);
        x=r-l+1;
        y=lg[x];
        int aux1=rmq[y][l];
        int aux2=rmq[y][r-puteri[y]+1];
        //fout<<l<<" "<<r<<" "<<x<<" "<<y<<" "<<aux1<<" "<<aux2<<" ";
        if(nivel[aux1]<=nivel[aux2])
            fout<<aux1<<"\n";
        else
            fout<<aux2<<"\n";
    }
    return 0;
}