Cod sursa(job #1412480)

Utilizator gabib97Gabriel Boroghina gabib97 Data 1 aprilie 2015 12:17:43
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <vector>
#include <math.h>
using namespace std;
int n,m,i,j,lg,t,e[200005],niv[100005],x,y,r[200001][20],l[200001],f[100001];
char *b;
vector<int> G[100001];
void DFS(int s)
{
    int i,z=G[s].size();
    e[++t]=s;
    for (i=0;i<z;i++)
    {
        niv[G[s][i]]=niv[s]+1;
        DFS(G[s][i]);
        e[++t]=s;
    }
}
void rmq()
{
    int i,j,p=1;
    for (i=1;i<=t;i++) r[i][0]=e[i];
    for (j=1;p<=t;j++)
    {
        p<<=1;
        for (i=1;i<=t-p+1;i++)
            if (niv[r[i][j-1]]<=niv[r[i+(1<<(j-1))][j-1]])
                r[i][j]=r[i][j-1];
            else r[i][j]=r[i+(1<<(j-1))][j-1];
    }
    j=p=1;
    for (i=0;p<=t;i++,p<<=1)
        for (;j<p;j++) l[j]=i-1;
    for (;j<=t;j++) l[j]=i-1;
}
int lca(int i,int j)
{
    int log=l[j-i+1];
    if (niv[r[i][log]]<=niv[r[j-(1<<(log))+1][log]])
        return r[i][log];
    return r[j-(1<<(log))][log];
}
int main()
{
    freopen ("lca.in","r",stdin);
    freopen ("lca.out","w",stdout);
    fseek(stdin,0,SEEK_END);
    lg=ftell(stdin);
    rewind(stdin);
    b=(char*) malloc((lg+1)*sizeof(char));
    fread(b,sizeof(char),lg,stdin);
    for (j=0;isdigit(b[j]);j++) n=n*10+b[j]-'0';
    for (++j;isdigit(b[j]);j++) m=m*10+b[j]-'0';
    for (i=2;i<=n;i++)
    {
        t=0;
        for (++j;isdigit(b[j]);j++) t=t*10+b[j]-'0';
        G[t].push_back(i);
    }
    t=0;
    DFS(1);
    rmq();
    while (isspace(b[j])) j++;
    j--;
    for (i=t;i>=1;i--) f[e[i]]=i;
    for (i=1;i<=m;i++)
    {
        x=y=0;
        for (++j;isdigit(b[j]);j++) x=x*10+b[j]-'0';
        for (++j;isdigit(b[j]);j++) y=y*10+b[j]-'0';
        printf("%i\n",lca(min(f[x],f[y]),max(f[x],f[y])));
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}