Cod sursa(job #1679206)

Utilizator andrew_assassin789Andrei Manea andrew_assassin789 Data 7 aprilie 2016 19:11:01
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#define nmax 100005
using namespace std;
unsigned int t[nmax],h;
unsigned int niv[nmax];
unsigned int log2[nmax];
unsigned int P[18][nmax];
void dfs(unsigned int n)
{
    unsigned int i,x;
    niv[1]=1;
    for (i=2;i<=n;i++)
    {
        x=i;
        while (x)
        {
            x=t[x];
            niv[i]++;
        }
        h=max(h,niv[i]);
    }
}
unsigned int querry(unsigned int p, unsigned int q)
{
    int i;
    if (niv[p]<niv[q]) swap(p,q);
    for (i=log2[niv[p]];i>=0;i--)
    {
        if (niv[p]-(1<<i)>=niv[q])
            p=P[i][p];
    }
    if (p==q) return p;
    for (i=log2[niv[p]];i>=0;i--)
    {
        if (P[i][p] && P[i][p]!= P[i][q])
        {
            p=P[i][p];
            q=P[i][q];
        }
    }
    return t[p];
}
int main()
{
    ifstream f("lca.in");
    ofstream g("lca.out");
    unsigned int i,n,m,j,p,q;
    f>>n>>m;log2[1]=0;
    for (i=2;i<=n;i++)
    {
        f>>t[i];
        P[0][i]=t[i];
        log2[i]=log2[i/2]+1;
    }
    dfs(n);
    for (i=1;i<=log2[h];i++)
    {
        for (j=2;j<=n;j++)
        {
            P[i][j]=P[i-1][ P[i-1][j] ];
        }
    }
    for (i=1;i<=m;i++)
    {
        f>>p>>q;
        g<<querry(p,q)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}