Cod sursa(job #1638386)

Utilizator TibixbAndrei Tiberiu Tibixb Data 7 martie 2016 22:53:53
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<vector>
using namespace std;
vector<int> L[100005];
bool u[100005];
int n, m, nx, x[19][200005], xx, y[200005], first[200005], p, a, b, fiu, i, j;
void euler(int nod)
{
    x[0][++nx]=nod;
    if(first[nod]==0)
        first[nod]=nx;
    for(int i=0; i<L[nod].size(); i++)
    {
        int fiu=L[nod][i];
        if(u[fiu]==0)
        {
            u[fiu]=1;
            euler(fiu);
            x[0][++nx]=nod;
        }
    }
}
ifstream in("lca.in");
ofstream out("lca.out");
int main()
{
    in>>n>>m;
    for(i=2; i<=n; i++)
    {
        in>>xx;
        L[xx].push_back(i);
    }
    u[1]=1;
    euler(1);
    for(i=2; i<=nx; i++)
        y[i]=1+y[i/2];
    for(i=1; (1<<i)<=nx; i++)
    {
        for(j=1; j<=nx; j++)
        {
            x[i][j]=min(x[i-1][j], x[i-1][j+(1<<(i-1))]);
        }
    }
    for(;m--;)
    {
        in>>a>>b;
        a=first[a];
        b=first[b];
        if(a>b)
            swap(a, b);
        p=y[b-a+1];
        out<<min(x[p][a], x[p][b-(1<<p)+1])<<"\n";
    }
    return 0;
}