Cod sursa(job #2378965)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 12 martie 2019 19:31:12
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <stdio.h>
#include <vector>
#define oo 9999999
#define Min(a,b) (a<b ? a:b)
#include <algorithm>
using namespace std;
FILE *f,*g;
int Rank[100010],Poz[100010],log[200010];
int N,M;
vector <int> graf[100010];
int ss[3];
int RMQ[45][2*100010];
void DFS(int Node)
{
    int i,T=graf[Node].size(),vecin;
    RMQ[0][++N]=Node;
    if(!Poz[Node])Poz[Node]=N;
    for(i=0;i<T;++i)
    {
        vecin=graf[Node][i];
        if(!Rank[vecin])
        {
            Rank[vecin]=Rank[Node]+1;
            DFS(vecin);
            RMQ[0][++N]=Node;
        }
    }
}
void Update(int i,int j,int A,int B)
{
    if(Rank[A]<Rank[B])RMQ[i][j]=A;
    else RMQ[i][j]=B;
}
void CreateRMQ()
{
    int i,j,A,B;
    for(i=2;i<=N;++i)log[i]=log[i/2]+1;
    for(i=1;i<=log[N];++i)
        for(j=1;j+(1<<i-1)<=N+1;++j)
        {
            A=RMQ[i-1][j],B=RMQ[i-1][j+(1<<i-1)];
            Update(i,j,A,B);
        }
}
void Read()
{
    int i,X,Y;
    fscanf(f,"%d %d",&N,&M);
    for(i=2;i<=N;++i)
    {
        fscanf(f,"%d",&X);
        graf[X].push_back(i);
    }
    Rank[1]=1,Poz[1]=1,N=0;
    DFS(1);
    CreateRMQ();
}
void Solve()
{
    int X,Y,A,B,Sol;
    while(M)
    {
        --M;
        fscanf(f,"%d %d",&X,&Y);
        X=Poz[X],Y=Poz[Y];
        ss[1]=X,ss[2]=Y;
        sort(ss+1,ss+3);
        X=ss[1],Y=ss[2];
        A=log[Y-X+1];
        if(Rank[RMQ[A][X]]<Rank[RMQ[A][Y-(1<<A)+1]])Sol=RMQ[A][X];
        else Sol=RMQ[A][Y-(1<<A)+1];
        fprintf(g,"%d\n",Sol);
    }
}
int main()
{
    f=fopen("lca.in","r");g=fopen("lca.out","w");
    Read();Solve();
    fclose(f);fclose(g);
    return 0;
}