Cod sursa(job #1128037)

Utilizator DaniEsDani Stetcu DaniEs Data 27 februarie 2014 15:00:09
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<fstream>
#include<vector>
#define N 1000100
#define log 22
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, M, i, j, l, lg[N<<1], m[log][N<<1], x, viz[N], s[N<<1], t, a, b, dif;
vector<int> v[N];
void Euler(int nod)
{
    s[++t]=nod;
    if(!viz[nod])
        viz[nod]=t;
    for(int i=0; i<v[nod].size(); i++)
    {
        Euler(v[nod][i]);
        s[++t]=nod;
    }
}
int main ()
{
    f>>n>>M;
    for(i=2;i<=n;++i)
    {
        f>>x;
        v[x].push_back(i);
    }
    Euler(1);
    for(i=2;i<=t;++i)
        lg[i]=lg[i>>1]+1;
    for(i=1;i<=t;++i)
        m[0][i]=s[i];
    for(i=1;(1<<i)<=t;++i)
        for(j=1;j<=t-(1<<i);++j)
        {
            l=1<<(i-1);
            m[i][j]=min(m[i-1][j],m[i-1][j+l]);
        }
    for(i=1;i<=M;++i)
    {
        f>>a>>b;
        a=viz[a];
        b=viz[b];
        if(a>b)
            swap(a,b);
        dif=b-a+1;
        l=lg[dif];
        dif=dif-(1<<l);
        g<<min(m[l][a],m[l][a+dif])<<"\n";
    }
    return 0;
}