Pagini recente » Cod sursa (job #1289943) | Cod sursa (job #1593242) | Cod sursa (job #716539) | Cod sursa (job #2361529) | Cod sursa (job #999938)
Cod sursa(job #999938)
#include <iostream>
#include <fstream>
using namespace std;
const int Nmax = 502;
const int LgMax = 10;
int A[Nmax][Nmax];
int rmq[LgMax][Nmax][Nmax], lg[Nmax];
int N, M;
void RMQ()
{
for ( int i = 2; i < Nmax; ++i )
lg[i] = lg[i / 2] + 1;
for ( int i = 1; i <= N; ++i )
for ( int j = 1; j <= N; ++j )
rmq[0][i][j] = A[i][j];
for ( int k = 1; k <= lg[N]; ++k )
{
int p = 1 << ( k - 1 );
for ( int i = 1; i + p <= N; ++i )
for ( int j = 1; j + p <= N; ++j )
{
int max1 = max( rmq[k - 1][i][j], rmq[k - 1][i + p][j] );
int max2 = max( rmq[k - 1][i][j + p], rmq[k - 1][i + p][j + p] );
rmq[k][i][j] = max( max1, max2 );
}
}
}
int query( int i, int j, int k )
{
int l = lg[k];
int p = 1 << l;
int max1 = max( rmq[l][i][j], rmq[l][i][j + k - p] );
int max2 = max( rmq[l][i + k - p][j], rmq[l][i + k - p][j + k - p] );
return max( max1, max2 );
}
int main()
{
ifstream f("plantatie.in");
ofstream g("plantatie.out");
f >> N >> M;
for ( int i = 1; i <= N; ++i )
for ( int j = 1; j <= N; ++j )
f >> A[i][j];
RMQ();
for ( int i = 1, a, b, c; i <= M; ++i )
{
f >> a >> b >> c;
g << query( a, b , c) << "\n";
}
return 0;
}