Cod sursa(job #962376)

Utilizator misinozzz zzz misino Data 14 iunie 2013 18:47:16
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int x,y,m,n,i,j,niv[100100],a[100100][20];
vector<int>l[100100];
void dfs(int x,int lvl,int t)
{
    a[x][0]=t;
    niv[x]=lvl;
    for(int i=0;i<l[x].size();++i)
    if(!niv[l[x][i]])
    {
        dfs(l[x][i],lvl+1,x);
    }
}
int lca(int x,int y)
{
    int l1,l2;
    if(niv[x]<niv[y])
    swap(x,y);
    for(l1=1;(1<<l1)<niv[x];++l1);
    for(l2=1;(1<<l2)<niv[y];++l2);
    while(l1>=0)
    {
        if(niv[x]-(1<<l1)>=niv[y])
        x=a[x][l1];
        --l1;
    }
    if(x==y)
    return x;
    while(l2>=0)
    {
        if(a[x][l2]&&a[x][l2]!=a[y][l2])
        {
            x=a[x][l2];
            y=a[y][l2];
        }
        --l2;
    }
    return a[x][0];
}
int main()
{
    f>>n>>m;
    for(i=2;i<=n;++i)
    {
        f>>x;
        l[x].push_back(i);
    }
    dfs(1,1,0);
    for(i=1;(1<<i)<=n;++i)
    for(j=1;j<=n;++j)
    a[j][i]=a[a[j][i-1]][i-1];
    for(;m;--m)
    {
        f>>x>>y;
        g<<lca(x,y)<<'\n';
    }
    return 0;
}