Cod sursa(job #2378892)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 12 martie 2019 18:28:04
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 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],pdfs[100010],Poz[100010];
struct AIB
{
    int node,r;
};
AIB ARB[2*100010];
int N,M;
vector <int> graf[100010];
int ss[3];
void DFS(int Node)
{
    int i,T=graf[Node].size(),vecin;
    pdfs[++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);
            pdfs[++N]=Node;
        }
    }
}
int P,XX;
int Update()
{
    int i;
    for(i=1;i<2*100010;++i)ARB[i].r=oo;
}
void UpdateX(int left,int right,int Node)
{
    int middle=(right+left)/2;
    if(right==left)
    {
        ARB[Node].r=Rank[XX];ARB[Node].node=XX;
        return;
    }
    if(P<=middle) UpdateX(left,middle,2*Node);
    else UpdateX(middle+1,right,2*Node+1);
    ARB[Node].r=Min(ARB[2*Node+1].r,ARB[2*Node].r);
    if(ARB[2*Node].r<ARB[2*Node+1].r)ARB[Node].node=ARB[2*Node].node;
    else ARB[Node].node=ARB[2*Node+1].node;
}
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);Update();
    for(i=1;i<N;++i)
    {
        P=i,XX=pdfs[i];
        UpdateX(1,N-1,1);
    }
}
int A,B,Sol;
void Search(int left,int right,int Node)
{
    int middle;
    if(A<=left&&right<=B)
    {
        if(Sol>ARB[Node].r)Sol=ARB[Node].r,P=ARB[Node].node;
        return;
    }
    middle=(right+left)/2;
    if(A<=middle) Search(left,middle,2*Node);
    if(B>middle) Search(middle+1,right,2*Node+1);
}
void Solve()
{
    int X,Y;
    while(M)
    {
        --M;
        fscanf(f,"%d %d",&X,&Y);
        A=Poz[X],B=Poz[Y],Sol=oo;
        ss[1]=A,ss[2]=B;
        sort(ss+1,ss+3);
        A=ss[1],B=ss[2];
        Search(1,N,1);
        fprintf(g,"%d\n",P);
    }
}
int main()
{
    f=fopen("lca.in","r");g=fopen("lca.out","w");
    Read();Solve();
    fclose(f);fclose(g);
    return 0;
}