Cod sursa(job #801047)

Utilizator ioanabIoana Bica ioanab Data 23 octombrie 2012 11:27:16
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
using namespace std;

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

const int N=250005,lg=19;
int t[N][lg],depth[N];

int bs(int x, int y)
{
    int i;
    for(i=lg-1;i>=0;i--)
        if(x>=(1<<i))
        {
            x-=(1<<i);
            y=t[i][y];
        }
    return y;
}

void dfs(int i)
{
    if (!t[0][i]){
        depth[i] = 1;
        return;
    }

    if (!depth[ t[0][i] ])
        dfs(t[0][i]);

    depth[i]=depth[t[0][i]]+1;
}

int rez(int x,int y)
{
    for(int i=lg;i>=0;i--)
        if(t[i][x]!=t[i][y])
        {
            x=t[i][x];
            y=t[i][y];
        }
    return t[0][x];
}

int main()
{
    int n,m,i,x,y;
    in>>n>>m;
    for(i=2;i<=n;i++)
        in>>t[0][i];

    for(i=1;i<lg;i++)
        for(int j=1;j<=n;j++)
            t[i][j]=t[i-1][t[i-1][j]];

    for(i=1;i<=n;i++)
    {
        if(!depth[i])
            dfs(i);
    }

    while(m--)
    {
        in>>x>>y;
        if(depth[x]>depth[y])
            x=bs(depth[x]-depth[y],x);
        else
            y=bs(depth[y]-depth[x],y);
        out<<rez(x,y)<<"\n";
    }
}