Cod sursa(job #2379294)

Utilizator NaritaandreiCNAINarita Andrei NaritaandreiCNAI Data 13 martie 2019 11:58:21
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
FILE *f,*g;
int arb[200002];
struct graph
{
    int node,next;
}v[200002];
int start[100002],st[200002],poz[100002],rang[100002];
int n,m,a,b,sol;
void read()
{   int y,k=0;
    fscanf(f,"%d %d",&n,&m);
    for(int i=2; i<=n; i++)
    {
        fscanf(f,"%d",&y);
        v[++k].node=y;
        v[k].next=start[i];
        start[i]=k;

        v[++k].node=i;
        v[k].next=start[y];
        start[y]=k;
    }
}
int minim(int a,int b)
{
    return a<b ? a:b;
}
void build(int node, int stg,int dr)
{
    if(stg==dr)
    {
        arb[stg]=rang[st[stg]];
        return;
    }
    int mij=(stg+dr)/2;
    build(2*node, stg, mij);
    build(2*node+1, mij+1, dr);
    arb[node]=minim(arb[2*node],arb[2*node+1]);
}
void query(int node, int stg, int dr)
{
    if(a<=stg && dr<=b)
    {
        if(arb[node]<sol)
            sol=arb[node];
        return;
    }
    int mij=(stg+dr)/2;
    if(a<=mij)
        query(2*node, stg, mij);
    if(b>mij)
        query(2*node+1,mij+1,dr);
}
void euler(int nod)
{
    st[++st[0]]=nod;
    if(!poz[nod])
        poz[nod]=st[0];
    for(int i=start[nod]; i; i=v[i].next)
    {
        if(!rang[v[i].node])
        {
            rang[v[i].node]=rang[nod]+1;
            euler(v[i].node);
            st[++st[0]]=nod;
        }
    }
}
void solve()
{   int x,y;
    euler(1);
    /*for(int i=1; i<=st[0]; i++)
        fprintf(g,"%d ",st[i]);
    fprintf(g,"\n");
    for(int i=1; i<=st[0]; i++)
        fprintf(g,"%d ",rang[st[i]]);*/
    n=st[0];
    build(1,1,n);
    for(int l=1; l<=m; l++)
    {
        fscanf(f,"%d %d",&x,&y);
        a=poz[y];
        b=poz[x];
        sol=9999999;
        query(1,1,n);
        fprintf(g,"%d\n",sol);
    }
}
int main()
{
    f=fopen("lca.in","r");
    g=fopen("lca.out","w");
    read();
    solve();
    //write();
    fclose(f);
    fclose(g);
    return 0;
}