Cod sursa(job #2300145)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 10 decembrie 2018 21:52:22
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>

using namespace std;

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

const int NMAX = 505;
const int K = 6;

int N, nr_q;
long long mat[K][NMAX][NMAX];
int lg[NMAX];

void Pre()
{
  for( int i = 2; i <= NMAX; ++i )
    lg[i] = lg[i / 2] + 1;

  long long aux;

  for( int I = 1; I <= K; ++I )
    for( int i = 1; i + ( 1 << I ) - 2 <= N; ++i )
      for( int j = 1; j + ( 1 << I ) - 2 <= N; ++j )
        {
          aux = 1 << ( I - 1 );

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

  /*for( int I = 0; I <= 4; ++I )
  {
    for( int i = 1; i <= N; ++i )
    {
      for( int j = 1; j <= N; ++j )
        fout << mat[I][i][j] << ' ';

      fout << '\n';
    }

    fout << "\n\n";
  }*/
}

void Do()
{
  int L, C, k;
  int lg_k;
  int pow_k;

  for( int i = 1; i <= nr_q; ++i )
   {
     fin >> L >> C >> k;

     lg_k = lg[k];
     pow_k = ( 1 << lg_k );

     fout << max( max( mat[lg_k][L][C], mat[lg_k][L][C + k - pow_k] ), max( mat[lg_k][L + k - pow_k][C], mat[lg_k][L + k - pow_k][C + k - pow_k]) ) << '\n';
   }

  fout.close();
}

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

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

  Pre();
}

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

    return 0;
}