Cod sursa(job #1145263)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 18 martie 2014 00:44:08
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <cstdio>
#include <vector>
#include <bitset>
#include <cmath>

#define Nmax 200005

using namespace std;
int N,Q,daddy[Nmax];
int RMQ[18][Nmax];
int val[18][Nmax];
int pz[Nmax];
int nre;
vector<int> G[Nmax];
bitset<Nmax> used;

void read()
{
    scanf("%d%d",&N,&Q);
    for(int i = 2; i <= N; ++i)
    {
        scanf("%d",&daddy[i]);
        G[daddy[i]].push_back(i);
    }
}

void DFS(int k,int niv)
{
    used[k] = 1;
    RMQ[0][++nre] = k;
    val[0][nre] = niv;
    for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
        if(!used[*it])
        {
            DFS(*it,niv+1);
            RMQ[0][++nre] = k;
            val[0][nre] = niv;
        }
}

void Build()
{
    int lmax = (int)log2(nre),gap = 1;
    for(int line = 1; line <= lmax; ++line)
    {
        for(int i = 1; i <= nre; ++i)
            if(i+gap > nre)
            {
                RMQ[line][i] = RMQ[line][i-1];
                val[line][i] = val[line][i-1];
            }
            else
            {
                if(val[line-1][i] < val[line-1][i+gap])
                {
                    RMQ[line][i] = RMQ[line-1][i];
                    val[line][i] = val[line-1][i];
                }
                else
                {
                    RMQ[line][i] = RMQ[line-1][i+gap];
                    val[line][i] = val[line-1][i+gap];
                }
            }
        gap <<= 1;
    }
}

int Querry(int a,int b)
{
    int len = (int)log2(b-a+1);
    return min(RMQ[len][a],RMQ[len][b-(1<<len)+1]);
}

void solve()
{
    int a,b;
    for(int i = 1; i <= nre; ++i)
        if(!pz[RMQ[0][i]])pz[RMQ[0][i]] = i;
    while(Q--)
    {
        scanf("%d%d",&a,&b);
        if(pz[a] < pz[b])
            printf("%d\n",Querry(pz[a],pz[b]));
        else
            printf("%d\n",Querry(pz[b],pz[a]));
    }
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);

    read();
    DFS(1,1);
    Build();
    solve();

    return 0;
}