Cod sursa(job #1562058)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 4 ianuarie 2016 19:24:46
Problema Lowest Common Ancestor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.54 kb
#include <stdio.h>
#include <ctype.h>

const int nmax=100001;
const int buffsize=65536;

char buff2[buffsize];
int bzb=buffsize;


inline char urm(FILE *f)
{
    if (bzb == buffsize)
    {
        fread(buff2,1,buffsize,f);
        bzb=0;
    }

    return buff2[bzb++];
}

inline int citire(FILE *f)
{
    int nr=0;
    char c;

    do
    {
        c=urm(f);
    }
    while (!isdigit(c));

    do
    {
        nr=nr*10+c-'0';
        c=urm(f);
    }
    while (isdigit(c));

    return nr;
}

struct element
{
    int nod,next;
};

inline int min(int a, int b)
{
    if (a < b)
        return a;
    return b;
}

inline void swp(int &a, int &b)
{
    int aux;

    if (a > b)
    {
        aux=a;
        a=b;
        b=aux;
    }
}

int head[nmax];
int level[2*nmax];
int euler[2*nmax];
bool ap[nmax];
int first[nmax];
int query[19][nmax*2];
int lg[nmax*2];
element buff[nmax-1];

int pos;

inline void push(int n1, int n2, int pos)
{
    buff[pos].nod=n2;
    buff[pos].next=head[n1];
    head[n1]=pos;
}

void dfs(int nod, int lvl)
{
    int i;

    first[nod]=pos;
    level[pos]=lvl;
    euler[pos]=nod;
    ap[nod]=true;
    pos++;

    i=head[nod];
    while (i)
    {
        if (!ap[buff[i].nod])
        {
            dfs(buff[i].nod,lvl+1);
            level[pos]=lvl;
            euler[pos]=nod;
            pos++;
        }
        i=buff[i].next;
    }
}

void rmq()
{
    int i,j;

    for (i=0; i<pos; i++)
        query[0][i]=i+1;///initializari
    for (i=1; (1 << i) < pos; i++)
        for (j=0; j + (1 << i) <= pos; j++)
        {
            query[i][j]=query[i-1][j];
            if (level[query[i-1][j+ (1 << (i-1))]] < level[query[i][j]])
                query[i][j]=query[i-1][j+ (1 << (i-1))];
        }
}

void precalclg()
{
    int i;

    lg[1]=0;
    for (i=2; i<=pos; i++)
        lg[i]=lg[i/2]+1;
}

int main()
{
    FILE *f,*f2;
    int n,m,i,x,y,aux,a,b,ans;

    f=fopen("lca.in","r");
    f2=fopen("lca.out","w");
    n=citire(f);
    m=citire(f);
    for (i=2; i<=n; i++)
    {
        x=citire(f);
        push(x,i,i-1);
    }

    pos=1;
    dfs(1,0);
    pos=pos-1;
    rmq();
    precalclg();

    for (i=1; i<=m; i++)
    {
        x=citire(f);
        y=citire(f);
        a=first[x];
        b=first[y];
        swp(a,b);
        aux=lg[b-a+1];
        ans=min(query[aux][a-1],query[aux][b - (1 << aux)]);
        fprintf(f2,"%d\n",euler[ans]);
    }

    fclose(f);
    fclose(f2);
}