Cod sursa(job #1985528)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 28 mai 2017 01:07:50
Problema Stramosi Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <ctype.h>
int lista[250001],nod[300001],next[300001],s[250001][20],nr;
void add(int x,int y)
{
    nr++;
    next[nr]=lista[x];
    lista[x]=nr;
    nod[nr]=y;
}
int G()
{
    int nr=0;
    char c=getchar();
    while(!isdigit(c))
        c=getchar();
    while(isdigit(c))
    {
        nr=nr*10+c-'0';
        c=getchar();
    }
    return nr;
}
int lca(int x,int k)
{
    int pas=1<<18,z=0,lg=18;
    while(pas)
    {
        if(z+pas<=k)
            x=s[x][lg+1],z+=pas;
        pas/=2;
        lg--;
    }
    return x;
}
int main()
{
    int n,m,i,x,z,q,p,j;
    freopen("stramosi.in","r",stdin);
    freopen("stramosi.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++)
    {
        x=G();
        add(x,i);
    }
    for(i=0; i<=n; i++)
    {
        z=lista[i];
        while(z)
        {
            s[nod[z]][1]=i;
            z=next[z];
        }
    }
    for(j=2; j<=18; j++)
        for(i=0; i<=n; i++)
            s[i][j]=s[s[i][j-1]][j-1];
    for(i=1; i<=m; i++)
    {
        q=G();
        p=G();
        printf("%d\n",lca(q,p));
    }
    return 0;
}