Cod sursa(job #2595123)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 7 aprilie 2020 10:27:57
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 500;
const int MMAX = 75000;

int n, m, rmq[20][NMAX + 1][NMAX + 1];
int mat[NMAX + 1][NMAX + 1];
int Log2[NMAX + 1];

int maxi( int a, int b, int c, int d ) {
  a = max( a, b );
  a = max( a, c );
  a = max( a, d );
  return a;
}

void build_rmq( ) {
  for( int i = 2; i <= NMAX; i ++ )
    Log2[i] = Log2[i / 2] + 1;
  for( int i = 1; i <= n; i ++ )
    for( int j = 1; j <= n; j ++ )
      rmq[0][i][j] = mat[i][j];
  for( int k = 1; k <= Log2[n]; k ++ ) {
    int p = 1<<(k - 1);
    for( int i = 1<<k; i <= n; i ++ ) {
      for( int j = 1<<k; j <= n; j ++ ) {
        rmq[k][i][j] = maxi( rmq[k - 1][i][j], rmq[k - 1][i - p][j], rmq[k - 1][i][j - p], rmq[k - 1][i - p][j - p] );
      }
    }
  }
}

int query( int i, int j, int k ) {
  int i1, i2, j1, j2;
  i1 = i;
  j1 = j;
  i2 = i + k - 1;
  j2 = j1 + k - 1;
  int p = Log2[k];
  int l = (1<<p) - 1;
  return maxi( rmq[p][i2][j2], rmq[p][i1 + l][j2], rmq[p][i2][j1 + l], rmq[p][i1 + l][j1 + l] );
}

int main() {
    fin>>n>>m;
    for( int i = 1; i <= n; i ++ )
      for( int j = 1; j <= n; j ++ )
        fin>>mat[i][j];
    build_rmq();
    for( int i = 1; i <= m; i ++ ) {
      int a, b, c;
      fin>>a>>b>>c;
      fout<<query(a, b, c)<<"\n";
    }
    return 0;
}