Cod sursa(job #923370)

Utilizator Bogdan13Bogdan Stoian Bogdan13 Data 23 martie 2013 13:49:44
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#include<vector>
#define NMAX 100005
using namespace std;

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

int N,Q,x,viz[NMAX],nr,fst[NMAX],M[NMAX*2][18],a,b,aux,lg2[2*NMAX];
vector<int> L[NMAX];
struct{ int nod,lvl;}euler[2*NMAX];


void df(int x,int k)
{
    nr++;
    euler[nr].nod=x;
    euler[nr].lvl=k;
    fst[x]=nr;

    for (int i=0;i<L[x].size();i++)
        if (!viz[L[x][i]])
         {
             viz[ L[x][i] ]=1;

             df(L[x][i],k+1);
             nr++;
             euler[nr].nod=x;
             euler[nr].lvl=k;

         }

}

void pre()
{
  for (int i=1;i<=nr;i++)
  M[i][0]=i;

  for (int j=1;(1<<j)<=nr;j++)
    for (int i=1;i<=nr-(1<<j)+1;i++)
        if (euler[ M[i][j-1] ].nod < euler[ M[i+(1<<j-1)][j-1] ].nod)
        M[i][j]=M[i][j-1];
        else
        M[i][j]=M[i+(1<<j-1)][j-1];

 for (int i=2;i<=nr;i++)
 lg2[i]=lg2[i/2]+1;
}

int main()
{
    f>>N>>Q;
    for (int i=1;i<=N-1;i++)
    {
        f>>x;
        L[x].push_back(i+1);
    }

    df(1,0);
    pre();

    for (int i=1;i<=Q;i++)
    {
        f>>a>>b;
        a=fst[a];
        b=fst[b];

        if (b<a) {aux=a; a=b; b=aux;}

        int k=b-a+1;
        k=lg2[k];

        g<<min(euler[M[a][k]].nod,euler[M[b-(1<<k)+1][k]].nod)<<'\n';
    }



return 0;
}