Pagini recente » Cod sursa (job #96352) | Cod sursa (job #1150824) | Cod sursa (job #1418324) | Cod sursa (job #1684519) | Cod sursa (job #1043118)
#include <cstdio>
#define MAX_N 500
#define MAX_LOG 9
int rmq[MAX_LOG][MAX_N][MAX_N];
int log2[MAX_N];
inline int max( int x, int y ) {
return x > y ? x : y;
}
void read( FILE *fin, int &n, int &m ) {
fscanf( fin, "%d%d", &n, &m );
for ( int i = 0; i < n; ++i )
for ( int j = 0; j < n; ++j )
fscanf( fin, "%d", &rmq[0][i][j] );
}
void gen_rmq( int n ) {
for ( int len = 1; ( 1 << len ) <= n; ++len )
for ( int i = 0; i < n; ++i )
for ( int j = 0; j < n; ++j ) {
rmq[len][i][j] = rmq[len - 1][i][j];
int half = 1 << ( len - 1 );
if ( i + half < n && j + half < n )
rmq[len][i][j] = max( rmq[len][i][j], rmq[len - 1][i + half][j + half] );
if ( i + half < n )
rmq[len][i][j] = max( rmq[len][i][j], rmq[len - 1][i + half][j] );
if ( j + half < n )
rmq[len][i][j] = max( rmq[len][i][j], rmq[len - 1][i][j + half] );
}
}
void pregen_log2( int n ) {
for ( int i = 2; i <= n; ++i )
log2[i] = log2[i >> 1] + 1;
}
int main() {
FILE *fin, *fout;
fin = fopen( "plantatie.in", "r" );
int n, m;
read( fin, n, m );
gen_rmq( n );
pregen_log2( n );
fout = fopen( "plantatie.out", "w" );
while ( m ) {
int x1, y1, side;
fscanf( fin, "%d%d%d", &x1, &y1, &side );
--x1, --y1;
int x2 = x1 + side - 1, y2 = y1 + side - 1;
int len = log2[side];
int ans = rmq[len][x1][y1];
ans = max( ans, rmq[len][x2 - ( 1 << len ) + 1][y1] );
ans = max( ans, rmq[len][x1][y2 - ( 1 << len ) + 1] );
ans = max( ans, rmq[len][x2 - ( 1 << len ) + 1][y2 - ( 1 << len ) + 1] );
fprintf( fout, "%d\n", ans );
--m;
}
fclose( fin );
fclose( fout );
}