Cod sursa(job #2905270)

Utilizator mariailincailinca maria nechita mariailinca Data 20 mai 2022 17:17:05
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<iostream>
#include<fstream>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

int n,m,matr[502][502],lg2[502],rmq[10][502][502],x,y,lat,l;

inline int interogare(int x, int y, int lat)
{
	int l = lg2[lat],smax = 0;

	smax = max(rmq[l][x][y], rmq[l][x - (1<<l) + lat][y]);

	if(max(rmq[l][x][y - (1<<l) + lat], rmq[l][x - (1<<l) + lat][y - (1<<l) + lat]) > smax) smax = max(rmq[l][x][y - (1<<l) + lat], rmq[l][x - (1<<l) + lat][y - (1<<l) + lat]);

	return smax;
}

int main()
{
	fin>>n>>m;

	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= n; ++j)
        {
			fin>>matr[i][j];
			rmq[0][i][j] = matr[i][j];
		}

	lg2[1] = 0;

	for(int i = 2; i <= n; ++i)
        lg2[i] = lg2[i>>1]+1;

	for(int k = 1; (1<<k)<=n; ++k)
		for(int i = 1; i <= n - (1<<k) + 1; ++i)
			for(int j=1; j <= n - (1<<k) + 1; ++j)
            {
				l = 1<<(k-1);
                rmq[k][i][j] = max(rmq[k-1][i][j], rmq[k-1][i+l][j]);
              if(max(rmq[k-1][i][j+l], rmq[k-1][i+l][j+l]) > rmq[k][i][j])
                    rmq[k][i][j] = max(rmq[k-1][i][j+l], rmq[k-1][i+l][j+l]);
			}
 // productivitate maxima dintr-un patrat cu coltul stanga-sus pe linia i si coloana j si latura k
	for(int i = 1; i <= m; ++i)
    {
		fin>>x>>y>>lat;

		fout<<interogare(x,y,lat)<<"\n";
	}

	return 0;
}