Pagini recente » Cod sursa (job #356867) | Rating alba catalin (catatac) | Cod sursa (job #311427) | Cod sursa (job #519791) | Cod sursa (job #2481020)
#include <iostream>
#include <fstream>
#define NMAX 500
#define LGMAX 10
std::ifstream fin ( "plantatie.in" );
std::ofstream fout ( "plantatie.out" );
int v[NMAX][NMAX];
class RMQ_2D {
private :
short logs[1 + NMAX];
int rmq[LGMAX][NMAX][NMAX];
public :
void calculateLogs ( int N ) {
logs[1] = 0;
for ( int i = 2; i <= N; ++i )
logs[i] = 1 + logs[i / 2];
}
public :
void calculateRMQ ( int N ) {
for ( int i = 0; i < N; ++i )
for ( int j = 0; j < N; ++j )
rmq[0][i][j] = v[i][j];
for ( int l = 1; l <= logs[N]; ++l ) {
for ( int i = 0; i <= N - ( 1 << l ); ++i ) {
for ( int j = 0; j <= N - ( 1 << l ); ++j ) {
int ans1 = std::max ( rmq[l - 1][i][j], rmq[l - 1][i][j + ( 1 << ( l - 1 ) )] );
int ans2 = std::max ( rmq[l - 1][i + ( 1 << ( l - 1 ) ) ][j], rmq[l - 1][i + ( 1 << ( l - 1 ) )][j + ( 1 << ( l - 1 ) )] );
rmq[l][i][j] = std::max ( ans1, ans2 );
}
}
}
}
public :
int maxInterval ( int x1, int y1, int l ) {
int x2 = x1 + l - 1;
int y2 = y1 + l - 1;
int lg = logs[l];
int ans1 = std::max ( rmq[lg][x1][y1], rmq[lg][x1][y2 - ( 1 << lg ) + 1] );
int ans2 = std::max ( rmq[lg][x2 - ( 1 << lg ) + 1][y1], rmq[lg][x2 - ( 1 << lg ) + 1][y2 - ( 1 << lg ) + 1] );
return std::max ( ans1, ans2 );
}
};
int main () {
int N, Q;
fin >> N >> Q;
//std::cout << N << ' ' << Q << '\n';
for ( int i = 0; i < N; ++i )
for ( int j = 0; j < N; ++j )
fin >> v[i][j];
RMQ_2D* p = new RMQ_2D();
p -> calculateLogs ( N );
p -> calculateRMQ ( N );
for ( int i = 0; i < Q; ++i ) {
int x, y, l;
fin >> x >> y >> l;
--x;
--y;
//std::cout << x << ' ' << y << ' ' << l << '\n';
fout << p -> maxInterval ( x, y, l ) << '\n';
}
free ( p );
return 0;
}