Cod sursa(job #1083214)

Utilizator Raba_SebastianRaba Sebastian Stefan Raba_Sebastian Data 15 ianuarie 2014 18:52:20
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>
#define NMax 100005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int N,M,H[2*NMax],RMQ[20][2*NMax],Log2[2*NMax],L[2*NMax],First[NMax],k;
vector <int> G[NMax];

void DFS(int nod,int level)
{
    H[++k]=nod;
    L[k]=level;
    First[nod]=k;
    for(unsigned int i=0;i<G[nod].size();i++)
        {
            int vecin=G[nod][i];
            DFS(vecin, level+1);
            H[++k]=nod;
            L[k]=level;
        }
}

int main()
{
    int i,j;
    fin>>N>>M;

    for(i=2;i<=N;i++)
        {
        int x;
        fin>>x;
        G[x].push_back(i);
        }

    DFS(1,0);

    for(i=2;i<=k;i++)
        Log2[i]=Log2[i/2]+1;

    for(i=1;i<=k;i++)
        RMQ[0][i]=i;

    for(i=1;(1<<i)<=k;i++)
        for(j=1;j<=k-(1<<i)+1;j++)
            if(L[RMQ[i-1][j]]>L[RMQ[i-1][j+(1<<(i-1))]])
                RMQ[i][j]=RMQ[i-1][j+(1<<(i-1))];
            else
                RMQ[i][j]=RMQ[i-1][j];

    while(M--)
    {
        int x,y;
        fin>>x>>y;
        x=First[x];
        y=First[y];
        if(x>y)
            swap(x,y);
        int lungime=y-x+1;
        int k=Log2[lungime];
        fout<<min(H[RMQ[k][x]],H[RMQ[k][y-(1<<k)+1]])<<"\n";
    }
    return 0;
}