Cod sursa(job #2280045)

Utilizator Andrei4000Stefan Andrei Andrei4000 Data 10 noiembrie 2018 11:08:05
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

const int N = 1000001;
const int L = 16;

int n,ti[N],to[N],m,tati[N],s[L][N],timp=0;

vector<int> fii[N];

void dfs(int x)
{
    ti[x]=++timp;
    for(auto y:fii[x])
    {
        dfs(y);
    }
    to[x]=++timp;
}

bool stramos(int x,int y)
{
    return (ti[x]<=ti[y] && to[y]<=to[x]);
}

int lca (int x,int y)
{
    int pas=L;
    if (stramos(x,y)) return x;
    if (stramos(y,x)) return y;
    while(pas>=0)
    {
        if((s[pas][x]!=0) && !stramos(s[pas][x],y))
        {
            x=s[pas][x];
        }
        pas--;
    }
    return s[0][x];
}

int main()
{


    fstream f("lca.in");
    f>>n>>m;
    int i,t,j=1,x,y;
    for(i=2; i<=n; i++)
    {
        f>>s[0][i];//tati[i];
        //s[1][(j++)+1]=tati[i];
        fii[s[0][i]].push_back(i);
    }
    for(int i=1; (1<<i)<=n ; i++)
    {
        for(int j=1; j<=n; j++)
        {
            s[i][j]=s[i-1][s[i-1][j]];
        }
    }
    dfs(1);
    /*for(i=1;i<=n;i++)
    cout<<ti[i]<<" "<<to[i]<<endl; */
    for(i=0; i<=4; i++)
    {
        for(j=1; j<=n; j++)
        {
            cout<<s[i][j]<<" ";
        }
        cout<<endl;
    }

    ofstream g("lca.out");
    for(int a=1; a<=m; a++)
    {
        f>>x>>y;
        t=lca(x,y);
        g<<t<<endl;



    }


    return 0;
}