Cod sursa(job #2392538)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 30 martie 2019 09:58:35
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;

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

vector <int> v[100100];
vector <int> euler,ad;
int n,nr,m,p[100100];

void parcurgere_euler(int rad,int adancime)
{
    int i;
    nr++;
    if(p[rad]==0)p[rad]=nr;

    //cout<<rad<<'\n';
    ad.push_back(adancime);
    euler.push_back(rad);

    for(i=0;i<v[rad].size();i++)
    {
        parcurgere_euler(v[rad][i],adancime+1);
      //  cout<<rad<<'\n';
        nr++;
        if(p[rad]==0)p[rad]=nr;

        ad.push_back(adancime);
        euler.push_back(rad);
    }
}


int i,j,x,A,B,N,ad1,ad2,D[500100][22];
int main()
{
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }




    parcurgere_euler(1,0);

    // for(i=0;i<ad.size();i++)g<<ad[i]<<" ";
    //g<<'\n';

    //for(i=1;i<=n;i++)
    //    g<<p[i]<<" ";

    N=euler.size();
    for(i=1;i<=N;i++)
        D[i][0]=euler[i-1];



    for(j=1;(1<<j)<=N;j++)
    {
        for(i=1;i+(1<<j)-1<=N;i++)
        {

            // pun "-1" ca e in STL

            ad1 = ad[p[D[i][j-1]]-1];
            ad2 = ad[p[D[i+(1<<(j-1))][j-1]]-1];

           // g<<ad1<<" "<<ad2<<'\n';

            if(ad1<ad2)D[i][j]=D[i][j-1];
            else D[i][j]=D[i+(1<<(j-1))][j-1];
        }
    }

    for(i=1;i<=m;i++)
    {
        f>>A>>B;
        A=p[A];
        B=p[B];

        if(A>B)swap(A,B);

        x=log2(B-A+1);

        ad1 = ad[p[D[A][x]]-1];
        ad2 = ad[p[D[B-(1<<x)+1][x]]-1];


       // g<<D[A][x]<<" ";


        if(ad1<ad2)g<<D[A][x]<<'\n';
        else g<<D[B-(1<<x)+1][x]<<'\n';

    }





    return 0;
}