Cod sursa(job #2272654)

Utilizator stefantagaTaga Stefan stefantaga Data 30 octombrie 2018 15:45:27
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <vector>
#include <cmath>
#define nmax 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int a[nmax];
vector <int> v[nmax];
bool viz[nmax];
int poz[nmax],q=0,nani[nmax];
void dfs(int x,int niv)
{
    int i;
    viz[x]=1;
    for (i=0;i<v[x].size();i++)
    {
        if (viz[v[x][i]]==0)
        {
            q++;
            a[q]=niv;
            nani[q]=x;
            if (poz[x]==0)
    {
        poz[x]=q;
    }
            dfs(v[x][i],niv+1);
        }
    }
    q++;
    a[q]=niv;
    nani[q]=x;
    if (poz[x]==0)
    {
        poz[x]=q;
    }
}
int n,m,i,x,j,rmq[21][nmax],lim,nr,y,st,dr,k;
int main()
{
    f>>n>>m;
    for (i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }
    dfs(1,1);
    for (i=1;i<=2*n-1;i++)
    {
        rmq[0][i]=i;
    }
    lim=2*n-1;
    nr=log2(lim);
    for (i=1;i<=nr;i++)
    {
        for (j=1;j<=lim-(1<<i)+1;j++)
        {
            if (a[rmq[i-1][j]]<=a[rmq[i-1][j+(1<<(i-1))]])
            {
                rmq[i][j]=rmq[i-1][j];
            }
            else
            {
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
            }
        }
    }
    for (i=1;i<=m;i++)
    {
        f>>x>>y;
        st=min(poz[x],poz[y]);
        dr=max(poz[x],poz[y]);
        k=log2(dr-st);
        if (a[rmq[k][st]]<a[rmq[k][dr-(1<<k)+1]])
        {
            g<<nani[rmq[k][st]]<<'\n';
        }
        else
        {
            g<<nani[rmq[k][dr-(1<<k)+1]]<<'\n';
        }
    }
    return 0;
}