Cod sursa(job #1217966)

Utilizator rangerChihai Mihai ranger Data 8 august 2014 23:58:34
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<fstream>
#include<vector>

using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int nmax = 100010;
int viz[nmax],niv[3*nmax],nivel[3*nmax],n,m,x,y,i,j,poz[nmax],rmq[3*nmax][20],lg[nmax*3];
vector<int> g[nmax],euler;

void dfs(int v)
{
    viz[v]=1;
    euler.push_back(v);
    for (int i=0;i<g[v].size();i++)
        if (!viz[g[v][i]])
    {
        niv[g[v][i]]=niv[v]+1;
        dfs(g[v][i]);
        euler.push_back(v);
    }
}
int main()
{
    cin>>n>>m;
    for (i=2;i<=n;i++)
    {
        cin>>x;
        g[x].push_back(i);
        g[i].push_back(x);
    }
    dfs(1);
    for (i=0;i<euler.size();i++) {
            nivel[i]=niv[euler[i]];
             poz[euler[i]]=i;
    }

    int len = euler.size();
    for (i=0;i<len;i++) rmq[i][0]=i;
    for (j=1;(1<<j)<=len;j++)
        for (i=0;(i+(1<<j)-1)<len;i++)
           if (nivel[rmq[i][j-1]]<nivel[rmq[i+ (1 << (j-1))][j-1]])
              rmq[i][j]=rmq[i][j-1];
                else rmq[i][j]=rmq[i+ (1<< (j-1))][j-1];


    for (i=1;i<=m;i++)
    {
        int p,q;
        cin>>p>>q;
        x=poz[p]; y=poz[q];
        int k=0;
        while (1<<k <= y-x+1) k++; k--;
        int ind;
        if (nivel[rmq[x][k]]<nivel[rmq[y-( 1 << k) +1][k]]) ind=rmq[x][k]; else
               ind = rmq[y - (1 << k) + 1][k];
        cout<<euler[ind]<<"\n";
    }
    return  0;
}