Cod sursa(job #2851098)

Utilizator andreic06Andrei Calota andreic06 Data 18 februarie 2022 09:07:54
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>

using namespace std;
const int NMAX = 500;
const int MAX_LOG = 9;

int n; int matrix[1 + NMAX][1 + NMAX];
int rmq[1 + MAX_LOG][1 + NMAX][1 + NMAX];
int log_table[1 + NMAX];

int qua_max ( int x, int y, int z, int t ) {
   int first = max ( x, y );
   int second = max ( z, t );
   return max ( first, second );
}
void def_table () {
    for ( int i = 2; i <= NMAX; i ++ )
       log_table[i] = log_table[i / 2] + 1;
    for ( int i = 1; i <= n; i ++ )
       for ( int j = 1; j <= n; j ++ )
          rmq[0][i][j] = matrix[i][j];
    for ( int p = 1; (1 << p) <= n; p ++ ) {
       int move_lines = (1 << (p - 1));
       for ( int i = 1; i + (1 << p) - 1 <= n; i ++ )
          for ( int j = 1; j + (1 << p) - 1 <= n; j ++ )
             rmq[p][i][j] = qua_max ( rmq[p - 1][i][j], rmq[p - 1][i + move_lines][j], rmq[p - 1][i][j + move_lines], rmq[p - 1][i + move_lines][j + move_lines] );
    }
}

int query ( int i, int j, int k ) {
   int log_of = log_table[k];
   int first = rmq[log_of][i][j];
   int second = rmq[log_of][i + k - (1 << log_of)][j];
   int third = rmq[log_of][i][j + k - (1 << log_of)];
   int fourth = rmq[log_of][i + k - (1 << log_of)][j + k - (1 << log_of)];
   return qua_max ( first, second, third, fourth );
}

ifstream fin ( "plantatie.in" );
ofstream fout ( "plantatie.out" );
int main()
{
   int q; fin >> n >> q;
   for ( int i = 1; i <= n; i ++ )
      for ( int j = 1; j <= n; j ++ )
         fin >> matrix[i][j];

   def_table ();
   for ( int index = 1; index <= q; index ++ ) {
      int i, j, k; fin >> i >> j >> k;
      fout << query ( i, j, k ) << "\n";
   }
    return 0;
}