Cod sursa(job #1807636)

Utilizator andrei_uAndrei andrei_u Data 16 noiembrie 2016 19:38:35
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");

int pe[100005],lv[100005],f[100001],p[1000005][25],y,xaux,yaux,aux,lg;
vector <int> v[100005];
int n,m,i,j,x,k,last,niv;

void euler(int x)
{


    for(int i=0;i<v[x].size();++i)
    {
        pe[++k]=x;

        if(f[x]== 0) f[x]=k;
        lv[k]=niv;
        niv++;
        euler(v[x][i]);
        niv--;

    }

    pe[++k]=x;
    lv[k]=niv;
     if(f[x]== 0) f[x]=k;
}

void rmq()
{

    for(i=0;i<=(int)log2(k);++i)
    {
        for(j=1;j<=k;++j)
        {
            if(i==0)
                p[j][i]=lv[j];

            else if(j+(1<<(i-1)) <=k)

                p[j][i]=min(p[j][i-1],p[j+(1<<(i-1))][i-1]);

        }
    }
}
int main()
{

    cin>>n>>m;

    for(i=1;i<n;++i)
    {
        cin>>x;

        v[x].push_back(i+1);
    }


    /// euler

    euler(1);

    /*for(i=1;i<=k;++i) cout<<pe[i]<<" ";

    cout<<"\n";
    for(i=1;i<=k;++i) cout<<lv[i]<<" ";


    cout<<"\n";
    for(i=1;i<=n;++i) cout<<f[i]<<" "; */

    rmq();

    //cout<<"\n";

    for(i=1;i<=m;++i)
    {
        cin>>xaux>>yaux;

        x=f[xaux];
        y=f[yaux];

         aux=y-x+1;
        lg=(int)log2(aux);

        if(x>y) swap(x,y);
        for(j=x;j<=y;++j)
            if(lv[j]==min(p[x][lg], p[y-(1<<lg)+1][lg]))
        {
            cout<<pe[j]<<"\n";
            break;
        }
      //  cout<<min(p[x][lg], p[y-(1<<lg)+1][lg])<<"\n";
    }
    return 0;
}