Cod sursa(job #2642002)

Utilizator eugen5092eugen barbulescu eugen5092 Data 13 august 2020 13:14:42
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;

ifstream ci("plantatie.in");
ofstream cou("plantatie.out");

int n,m;
int rmq[505][505][50];
int v[505][505];
int lg[505];
void Rmq()
{
	int i,j,k;
	int a,b,c,d,sol;;

	for(i=1; i<=n; i++)
	{
		for(j=1; j<=n; j++)
		{
			//cout<<i<<" "<<j<<"\n";
			k=1;
			sol=0;
			a=v[i][j];
			b=v[i+1][j];
			c=v[i][j+1];
			d=v[i+1][j+1];
			//cout<<a<<" "<<b<<" "<<c<<" "<<d<<"\n";
			sol=max(a,b);
			sol=max(sol,c);
			sol=max(sol,d);
			rmq[i][j][k]=sol;
		}
	}
	for(k=2; (1<<k)-1<=n; k++)
	{
		for(i=1; (1<<k)+i-1<=n; i++)
		{
			for(j=1; (1<<k)+j-1<=n; j++)
			{
				a=rmq[i][j][k-1];
				b=rmq[i+(1<<(k-1))][j][k-1];
				c=rmq[i][j+(1<<(k-1))][k-1];
				d=rmq[i+(1<<(k-1))][j+(1<<(k-1))][k-1];

				sol=max(a,b);
				sol=max(sol,c);
				sol=max(sol,d);
				rmq[i][j][k]=sol;
				//cout<<i<<" "<<j<<" "<<k<<" "<<rmq[i][j][k]<<"\n";
			}
		}
	}
	for(i=2; i<=n; i++)
	{
		lg[i]=lg[i/2]+1;
	}

}

int Query(int a,int b,int c)
{
	int k;
	k=lg[c]+1;
	int s1,s2,s4,s3,sol;
	s1=rmq[a][b][k-1];
	s2=rmq[a+c-(1<<(k-1))][b][k-1];
	s3=rmq[a][b+c-(1<<(k-1))][k-1];
	s4=rmq[a+c-(1<<(k-1))][b+c-(1<<(k-1))][k-1];
	sol=max(s1,s2);
	sol=max(sol,s3);
    sol=max(sol,s4);
    return sol;
}

void citire()
{
	ci>>n>>m;
	int i,j;
	int a,b,c;
	for(i=1; i<=n; i++)
	{
		for(j=1; j<=n; j++)
		{
			ci>>v[i][j];
		}
	}
	Rmq();
	while(m--)
	{
		ci>>a>>b>>c;
        cou<<Query(a,b,c)<<"\n";
	}
}

int main()
{
	citire();
	return 0;
}