Cod sursa(job #952621)

Utilizator primulDarie Sergiu primul Data 23 mai 2013 19:02:56
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<algorithm>
using namespace std;
 
int d[100001][18],t[100001],l[100001],i,n,m,j,x,y,z;
 
int lev(int x)
{
    if (l[x]==0)
        l[x]=lev(t[x])+1;
    return l[x];
}
 
int main()
{
    ifstream f("lca.in");
    ofstream g("lca.out");
    f >> n >> m;
    for (i=2;i<=n;i++)
        f >> t[i];
    l[1]=1;
    for (i=2;i<=n;i++)
        if (l[i]==0)
            l[i]=lev(i);
    for (i=2;i<=n;i++)
        d[i][0]=t[i];
    for (i=1;i<=n;i++)
        for (j=1;j<=17;j++)
            d[i][j]=d[d[i][j-1]][j-1];
    for (i=1;i<=m;i++)
    {
        f >> x >> y;
        if (l[x]<l[y])
            swap(x,y);
        z=l[x]-l[y];
        for (j=0;j<=17;j++)
            if (((1 << j) & z)>0)
                x=d[x][j];
        if (x==y)
        {
            g << x << "\n";
            continue;
        }
        for (j=17;j>=0;j--)
            if (d[x][j]!=d[y][j])
            {
                x=d[x][j];
                y=d[y][j];
            }
        g << t[x] << "\n";
    }
    return 0;
}