Cod sursa(job #832325)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 10 decembrie 2012 13:08:47
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int t,poz[222222],lvl[111111],x[222222],w[18][222222],l[222222];
vector <int> a[111111];

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


void parcurge(int nod,int niv)
{
    int i;
    if(poz[nod]==0)
        poz[nod]=t;
    lvl[nod]=niv;
    x[t]=nod;
    for(i=0;i<a[nod].size();++i)
    {
        ++t;
        parcurge(a[nod][i],niv+1);
        ++t;
        x[t]=nod;
    }
}

int main()
{
    int n,m,i,p,k,j,st,dr,aux;
    in>>n>>m;
    for(i=2;i<=n;++i)
    {
        in>>p;
        a[p].push_back(i);
    }
    t=1;
    parcurge(1,0);
    for(i=1;i<=t;++i)
    {
        w[0][i]=x[i];
    }
    p=2;
    for(i=1;p<=t;++i)
    {
        for(j=1;j<=t-p;++j)
        {
            if(lvl[w[i-1][j]]<lvl[w[i-1][j+p/2]])
                w[i][j]=w[i-1][j];
            else
                w[i][j]=w[i-1][j+p/2];
        }
        p*=2;
    }
    p=1;k=0;
    for(i=1;i<=t;++i)
    {
        if(2*p<=i)
        {
            p*=2;
            k++;
        }
        l[i]=k;
    }
    for(i=1;i<=m;++i)
    {
        in>>st>>dr;
        st=poz[st];
        dr=poz[dr];
        if(st>dr)
        {
            aux=st;
            st=dr;
            dr=aux;
        }
        if(lvl[w[l[dr-st+1]][st]]<lvl[w[l[dr-st+1]][dr-(1<<l[dr-st+1])+1]])
            out<<w[l[dr-st+1]][st]<<"\n";
        else
            out<<w[l[dr-st+1]][dr-(1<<l[dr-st+1])+1]<<"\n";
    }
    return 0;
}