Cod sursa(job #1957692)

Utilizator the.manIon Man the.man Data 7 aprilie 2017 18:34:41
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMax 500
using namespace std;
 ifstream fi("plantatie.in");
 ofstream fo("plantatie.out");
int rmq[10][NMax+1][NMax+1];
int v[NMax+1][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)] );
            }
}

int main()
{
    int i,j,k,t,res,M;

    fi>>N>>M;
    for(i = 1; i <= N; ++i)
        for(j = 1; j <= N; ++j) fi>>v[i][j];

    Build();
    while(M--)
    {
        fi>>i>>j>>k;
        t = log2(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)] );
        fo<<res<<'\n';
    }


return 0;
}