Pagini recente » Cod sursa (job #802095) | Cod sursa (job #2857968) | Cod sursa (job #2332316) | Cod sursa (job #1008416) | Cod sursa (job #2851098)
#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;
}