Cod sursa(job #999464)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 20 septembrie 2013 15:09:00
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int N,M;
vector <int> G[100002];
bool Use[100002];
int ind,First[100002],Level[100002<<1],counter;
int minimum_result[20][100002<<2],log[100002<<1];
int level;
void Calculate_log2()
{
    int i=2,next=2;
    while(i<=ind)
    {
        if(i!=next)
            log[i]=log[i-1];
        else
        {
            log[i]=log[i-1]+1;
            next=i*2;
        }
        i++;
    }
}
void Build_matrichs()
{
    int i,j,forward=1;
    for(i=1;i<=log[ind];i++)
    {
        for(j=1;j<=ind-forward*2+1;j++)
        {
            if(Level[minimum_result[i-1][j]]<Level[minimum_result[i-1][j+forward]])
                minimum_result[i][j]=minimum_result[i-1][j];
            else
                minimum_result[i][j]=minimum_result[i-1][j+forward];
        }
        forward*=2;
    }
}
void RMQ(int x,int y)
{
    int i;
    int how_much=log[y-x+1];
    if(log[y-x]==how_much-1)
        g<<minimum_result[log[y-x+1]][x]<<"\n";
    else
    {
        if(Level[minimum_result[how_much][x]]<Level[minimum_result[how_much][y-(1<<how_much)+1]])
            g<<minimum_result[how_much][x]<<"\n";
        else
            g<<minimum_result[how_much][y-(1<<how_much)+1]<<"\n";
    }
}
void Read()
{
    f>>N>>M;
    for(int i=1;i<=N-1;i++)
    {
        int value;
        f>>value;
        G[value].push_back(i+1);
    }
}
void DFS(int nod)
{
    minimum_result[0][++ind]=nod;
    if(Use[nod]==0)
        First[nod]=ind,counter++;
    Use[nod]=1;
    Level[nod]=level;
    level++;
    for(unsigned int i=0;i<G[nod].size();i++)
    {
        int vecin=G[nod][i];
        if(Use[vecin]==0)
        {
            DFS(vecin);
            if(counter<N)
                minimum_result[0][++ind]=nod;
        }
    }
    level--;
}
void Browse()
{
    int i;
    for(i=1;i<=M;i++)
    {
        int x,y;
        f>>x>>y;
        if(x>y)
            swap(x,y);
        RMQ(First[x],First[y]);
    }
}
int main()
{
    Read();
    DFS(1);
    Calculate_log2();
    Build_matrichs();
    Browse();
    return 0;
}