Cod sursa(job #1832633)

Utilizator silkMarin Dragos silk Data 20 decembrie 2016 17:34:50
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <algorithm>
#define NMax 500
#define Log 9
using namespace std;

int rmq[Log+1][NMax+1][NMax+1];
int v[NMax+1][NMax+1];
int P[NMax+1];
int N;

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

    for(i = 1; i <= N; ++i)
        for(j = 1; j <= N; ++j) rmq[0][i][j] = v[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)
            {
                rmq[k][i][j] = rmq[k-1][i][j];
                rmq[k][i][j] = max( rmq[k][i][j], rmq[k-1][i+(1<<k-1)][j] );
                rmq[k][i][j] = max( rmq[k][i][j], rmq[k-1][i][j+(1<<k-1)] );
                rmq[k][i][j] = max( rmq[k][i][j], rmq[k-1][i+(1<<k-1)][j+(1<<k-1)] );
            }
    for(i = 2; i <= NMax; ++i) P[i] = P[i/2] + 1;
}

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

    int i,j,k,t,res,M;

    scanf("%d %d",&N,&M);
    for(i = 1; i <= N; ++i)
        for(j = 1; j <= N; ++j) scanf("%d",&v[i][j]);

    Build();
    while(M--)
    {
        scanf("%d %d %d",&i,&j,&k);
        t = P[k];

        res = rmq[t][i][j];
        res = max( res, rmq[t][i+k-(1<<t)][j] );
        res = max( res, rmq[t][i][j+k-(1<<t)] );
        res = max( res, rmq[t][i+k-(1<<t)][j+k-(1<<t)] );
        printf("%d\n",res);
    }


return 0;
}