Cod sursa(job #999614)

Utilizator thewildnathNathan Wildenberg thewildnath Data 20 septembrie 2013 23:18:25
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>

int v[502][502],d[10][502][502],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,M,l,k,sol;
    scanf("%d%d",&n,&m);
    calc_log(n);
    M=Log[n];
    ///////////////
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=n;++j)
        {
            scanf("%d",&v[i][j]);
            d[0][i][j]=v[i][j];
        }
    }
    for(l=1;l<=M;++l)
    {
        for(i=1;i<=n;++i)
        {
            for(j=1;j<=n;++j)
            {
                if((i+(1<<l)-1<=n) && (j+(1<<l)-1<=n))
                {
                    d[l][i][j]=max(d[l-1][i][j],d[l-1][i][j+(1<<(l-1))]);
                    d[l][i][j]=max(d[l][i][j],d[l-1][i+(1<<(l-1))][j]);
                    d[l][i][j]=max(d[l][i][j],d[l-1][i+(1<<(l-1))][j+(1<<(l-1))]);
                }
            }
        }
    }
    //////////////////
    while(m--)
    {
        scanf("%d%d%d",&i,&j,&l);
        k=Log[l];
        sol=max(d[k][i][j],d[k][i][j+l-(1<<k)]);
        sol=max(sol,d[k][i+l-(1<<k)][j]);
        sol=max(sol,d[k][i+l-(1<<k)][j+l-(1<<k)]);
        printf("%d\n",sol);
    }
    return 0;
}