Cod sursa(job #76416)

Utilizator sealTudose Vlad seal Data 9 august 2007 19:13:46
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<stdio.h>
#define Nm 501
#define LognM 9
#define max(a,b) ((a)>(b)?(a):(b))
int M[LognM][Nm][Nm],n,m;

void read()
{
    int i,j;

    freopen("plantatie.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            scanf("%d",&M[0][i][j]);
}

void preprocessing()
{
    int k,i,j;

    for(k=1;1<<k<=n;++k)
        for(i=1;i<=n-(1<<k)+1;++i)
            for(j=1;j<=n-(1<<k)+1;++j)
            {
                M[k][i][j]=M[k-1][i][j];
                M[k][i][j]=max(M[k][i][j],M[k-1][i+(1<<k-1)][j]);
                M[k][i][j]=max(M[k][i][j],M[k-1][i][j+(1<<k-1)]);
                M[k][i][j]=max(M[k][i][j],M[k-1][i+(1<<k-1)][j+(1<<k-1)]);
            }
}

void answer()
{
    int i,j,k,l,ans;

    freopen("plantatie.out","w",stdout);
    while(m--)
    {
        scanf("%d%d%d",&i,&j,&l);
        for(k=0;1<<k<=l;++k);
        --k;
        ans=M[i][j][k];
        ans=max(ans,M[k][i+l-(1<<k)][j]);
        ans=max(ans,M[k][i][j+l-(1<<k)]);
        ans=max(ans,M[k][i+l-(1<<k)][j+l-(1<<k)]);
        printf("%d\n",ans);
    }
}

int main()
{
    read();
    preprocessing();
    answer();
    return 0;
}