Cod sursa(job #1755809)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 11 septembrie 2016 03:16:21
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <cstdio>
#include <cmath>
#define NMAX 503
using namespace std;

int N,M;
int dp[10][NMAX][NMAX];


void citire()
{
    scanf("%d%d",&N,&M);
    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++)
            scanf("%d",&dp[0][i][j]);
}

void set_dp()
{
    int pmax = log2(N);
    for(int p=1; p<=pmax; p++)
    {
        int imax = N - (1<<p) +1;

        for(int i=1; i<=imax; i++)
            for(int j=1; j<=imax; j++)
            {
                if(dp[p][i][j] < dp[p-1][i][j])
                    dp[p][i][j] = dp[p-1][i][j];
                if(dp[p][i][j] < dp[p-1][i+(1<<(p-1))][j])
                    dp[p][i][j] = dp[p-1][i+(1<<(p-1))][j];
                if(dp[p][i][j] < dp[p-1][i+(1<<(p-1))][j+(1<<(p-1))])
                    dp[p][i][j] = dp[p-1][i+(1<<(p-1))][j+(1<<(p-1))];
                if(dp[p][i][j] < dp[p-1][i][j+(1<<(p-1))])
                    dp[p][i][j] = dp[p-1][i][j+(1<<(p-1))];

            }
    }
}

int query(int l,int c,int k)
{
    int x = log2(k);
    int p = 1<<x;
    int rez = dp[x][l][c];
    rez = max(rez,dp[x][l+k-p][c]);
    rez = max(rez,dp[x][l+k-p][c+k-p]);
    rez = max(rez,dp[x][l][c+k-p]);
    return rez;
}

void rezolvare()
{
    for(int i=1;i<=M;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        printf("%d\n",query(x,y,z));
    }
}

int main()
{
    freopen("plantatie.in","r",stdin);
    freopen("plantatie.out","w",stdout);


    citire();
    set_dp();
    rezolvare();

    return 0;
}