Cod sursa(job #999092)

Utilizator thewildnathNathan Wildenberg thewildnath Data 19 septembrie 2013 10:29:10
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<stdio.h>

int v[502][502],d[502][502][10],Log[502];

void calc_log(int n)
{
    int e=0,l=1,i;
    for(i=1;i<=n;++i)
    {
        if(i>=l*2)
        {
            l*=2;
            ++e;
        }
        Log[i]=e;
    }
}

inline int max(int a,int b)
{
    return a>=b?a:b;
}

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    int n,m,i,j,sol,l,k,lat;
    scanf("%d%d",&n,&m);

    calc_log(n);
    ///////////////
    for(l=1;l<=n;++l)
    {
        for(i=1;i<=n;++i)
            scanf("%d",&v[l][i]);
        for(i=1;i<=n;++i)
            d[l][i][0]=i;
        for(j=1;1<<j<=n;++j)
        {
            for(i=1;i+(1<<j)-1<=n;++i)
            {
                if(v[l][d[l][i][j-1]]>=v[l][d[l][i+(1<<(j-1))][j-1]])
                    d[l][i][j]=d[l][i][j-1];
                else
                    d[l][i][j]=d[l][i+(1<<(j-1))][j-1];
            }
        }
    }
    ///////////////

    while(m--)
    {
        scanf("%d%d%d",&i,&j,&lat);
        k=Log[lat];
        sol=0;
        for(l=i;l<i+lat;++l)
        {

            if(v[d[l][j][k]]>=v[d[l][j+lat-1-(1<<k)+1][k]])
                sol=max(sol,v[l][d[l][j][k]]);
            else
                sol=max(sol,v[l][d[l][j+lat-1-(1<<k)+1][k]]);
        }
        printf("%d\n",sol);
    }
    return 0;
}