Cod sursa(job #2356214)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 26 februarie 2019 16:04:50
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin( "plantatie.in" );
ofstream fout( "plantatie.out" );

const int NMAX = 505;

int N, nr_q;

int rmq[12][NMAX][NMAX];
int lg[NMAX];

void Read()
{
  fin >> N >> nr_q;

  for( int i = 1; i <= N; ++i )
    for( int j = 1; j <= N; ++j )
     fin >> rmq[0][i][j];
}

void Do()
{
  int aux;

  for( int I = 1; ( 1 << I ) <= N; ++I )
  {
    for( int i = 1; i + ( 1 << I ) - 1 <= N; ++i )
      for( int j = 1; j + ( 1 << I ) - 1 <= N; ++j )
      {
        rmq[I][i][j] = rmq[I - 1][i][j];

        aux = 1 << ( I - 1 );

        rmq[I][i][j] = max( rmq[I][i][j], rmq[I - 1][i + aux][j] );
        rmq[I][i][j] = max( rmq[I][i][j], rmq[I - 1][i][j + aux] );
        rmq[I][i][j] = max( rmq[I][i][j], rmq[I - 1][i + aux][j + aux] );
      }
  }

  for( int i = 2; i <= 500; ++i )
    lg[i] = lg[i / 2] + 1;

  int x, y, k;
  int logg, ans, aux2;

  for( int i = 1; i <= nr_q; ++i )
  {
    fin >> x >> y >> k;

    logg = lg[k];
    aux = x + k - 1;
    aux2 = y + k - 1;

    ans = rmq[logg][x][y];
    ans = max( rmq[logg][x][y], rmq[logg][x][aux2 - ( 1 << logg ) + 1] );
    ans = max( rmq[logg][x][y], rmq[logg][aux - ( 1 << logg ) + 1][y] );
    ans = max( rmq[logg][x][y], rmq[logg][aux - ( 1 << logg ) + 1][aux2 - ( 1 << logg ) + 1] );

    fout << ans << '\n';
  }
}

int main()
{
   Read();
   Do();

   return 0;
}