Cod sursa(job #483105)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 6 septembrie 2010 22:19:27
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>

#define maxim(a,b) (a>b ? a : b)

int n,m,sol;
int d[504][504][13];

int main ()
{
    int i,j,t,p,px,py,l,ord;
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&d[i][j][0]);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            for(t=1;(1<<t)<=i && (1<<t)<=j;t++)
            {
                p=(1<<(t-1));
                d[i][j][t]=maxim(d[i][j][t-1],d[i-p][j-p][t-1]);
                d[i][j][t]=maxim(d[i][j][t],d[i-p][j][t-1]);
                d[i][j][t]=maxim(d[i][j][t],d[i][j-p][t-1]);
            }
    // am construit rmq-ul 2D
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&px,&py,&l);
        sol=0;p=1;ord=0;
        while(p<=l)
        {
            p*=2;
            ord++;
        }
        p/=2;ord--;
        sol=maxim(d[px+p-1][py+p-1][ord],d[px+p-1][py+l-1][ord]);
        sol=maxim(sol,d[px+l-1][py+p-1][ord]);
        sol=maxim(sol,d[px+l-1][py+l-1][ord]);
        printf("%d\n",sol);
    }

   return 0;
}