Cod sursa(job #1149410)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 21 martie 2014 20:18:18
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <algorithm>
#define Nmax 505

using namespace std;

int N,a[Nmax][Nmax],dp[Nmax][Nmax][10],t[Nmax];

inline void PreCalcul()
{
    int i;
    for(i=2;i<=Nmax;++i)
    {
        t[i]=t[i-1];
        if((1<<(t[i]+1))<=i)
            ++t[i];
    }
}

int main()
{
    int M,i,j,val,k,v,q,p,sol,x1,x2,y1,y2;
    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", &a[i][j]);
    PreCalcul();
    val=t[N];
    for(i=1;i<=N;++i)
        for(j=1;j<=N;++j)
            dp[i][j][0]=a[i][j];
    for(i=1;i<=N;++i)
        for(j=1;j<=N;++j)
            for(k=1;k<=val && (1<<k)<=i && (1<<k)<=j;++k)
            {
                v=(1<<(k-1));
                dp[i][j][k]=max(dp[i][j][k-1],dp[i][j-v][k-1]);
                dp[i][j][k]=max(dp[i][j][k],max(dp[i-v][j][k-1],dp[i-v][j-v][k-1]));
            }
    while(M--)
    {
        scanf("%d%d%d", &x1,&y1,&k);
        x2=x1+k-1; y2=y1+k-1;
        q=t[k]; p=(1<<q);
        sol=max(dp[x2][y2][q],max(dp[x1+p-1][y1+p-1][q],max(dp[x1+p-1][y2][q],dp[x2][y1+p-1][q])));
        printf("%d\n", sol);
    }
    return 0;
}