Cod sursa(job #887392)

Utilizator mihai27Mihai Popescu mihai27 Data 23 februarie 2013 18:48:30
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<fstream>
#include<vector>

using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");

int n,m,i,j,x,nr,y,k,b[30][200005];
vector<int> sol,a[100005],first(100005),log(200005);

void euler(int nod)
{
    if (!first[nod]) first[nod]=sol.size();
    sol.push_back(nod);
    for (vector<int>::iterator it=a[nod].begin();it!=a[nod].end();it++)
    {
        euler(*it);
        sol.push_back(nod);
    }
}

void rmq()
{
    log[1]=0;
    nr=sol.size();
    for (i=1;i<=nr;i++) b[0][i]=sol[i];
    for (i=2;i<=nr;i++)
        log[i]=log[i/2]+1;

    for (i=1;i<=log[nr];i++)
        for (j=1;j<=nr-(1<<i)+1;j++)
            b[i][j]=min(b[i-1][j],b[i-1][j+(1<<(i-1))]);

    for (i=1;i<=m;i++)
    {
        in>>x>>y;
        x=first[x];
        y=first[y];
        if (x>y) swap(x,y);
        k=log[y-x+1];

        out<<min(b[k][x],b[k][y-(1<<k)+1])<<'\n';
    }
}

int main()
{
    in>>n>>m;
    for (i=2;i<=n;i++)
    {
        in>>x;
        a[x].push_back(i);
    }
    sol.push_back(0);
    euler(1);
    rmq();
}