Cod sursa(job #2481020)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 26 octombrie 2019 12:56:49
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#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;
}