Cod sursa(job #1985526)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 28 mai 2017 01:03:58
Problema Stramosi Scor 80
Compilator c Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
int lista[250001],nod[300001],next[300001],s[250001][22],nr;
void add(int x,int y)
{
    nr++;
    next[nr]=lista[x];
    lista[x]=nr;
    nod[nr]=y;
}
int lca(int x,int k)
{
    int pas=1<<20,z=0,lg=20;
    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++)
    {
        scanf("%d",&x);
        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<=20; j++)
        for(i=0; i<=n; i++)
            s[i][j]=s[s[i][j-1]][j-1];
    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&q,&p);
        printf("%d\n",lca(q,p));
    }
    return 0;
}