Cod sursa(job #2638829)

Utilizator euyoTukanul euyo Data 30 iulie 2020 09:24:48
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <algorithm>
#include <cmath>

using namespace std;

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

const int MaxN = 502;
const int logMaxN = 10;

int maxRange[logMaxN][MaxN][MaxN];
int M[MaxN][MaxN];

struct point {
  int x, y;
};

static inline int query( int x1, int y1, int l ) {
  point p1, p2, p3, p4;
  
  int lgl = (int)log2( l );
  p1.x = x1;
  p1.y = y1;
  p2.x = x1;
  p2.y = y1 + l - (1 << lgl);
  p3.x = x1 + l - (1 << lgl);
  p3.y = y1;
  p4.x = x1 + l - (1 << lgl);
  p4.y = y1 + l - (1 << lgl);
  return max( max( maxRange[lgl][p1.x][p1.y], maxRange[lgl][p2.x][p2.y] ), max( maxRange[lgl][p3.x][p3.y], maxRange[lgl][p4.x][p4.y] ) );
}

int main() {
  int n, q, i, j, lgn, l;

  fin >> n >> q;
  lgn = (int)log2( n );
  for ( i = 0; i < n; ++i ) {
    for ( j = 0; j < n; ++j ) {
	  fin >> M[i][j];
	}
  }
  for ( i = 0; i < n; ++i ) {
	for ( j = 0; j < n; ++j ) {
      maxRange[0][i][j] = M[i][j];
	}
  }
  for ( l = 1; l <= lgn; ++l ) {
    for ( i = 0; i + (1 << (l - 1)) < n; ++i ) {
	  for ( j = 0; j + (1 << (l - 1)) < n; ++j ) {
		maxRange[l][i][j] = max( max( maxRange[l - 1][i][j], maxRange[l - 1][i][j + (1 << (l - 1))] ), max( maxRange[l - 1][i + (1 << (l - 1))][j], maxRange[l - 1][i + (1 << (l - 1))][j + (1 << (l - 1))] ) );
	  }
	}
  }
  while ( q-- ) {
	fin >> i >> j >> l;
    fout << query( i - 1, j - 1, l ) << "\n";
  }
  fin.close();
  fout.close();
  return 0;
}