Cod sursa(job #1892825)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 25 februarie 2017 12:07:32
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <bits/stdc++.h>
#define pb push_back
#define NMAX 505
#define INF 0x3f3f3f3f
#define x first
#define y second

using namespace std;

typedef pair<int, double> pii;

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

int v[NMAX][NMAX],preclog[NMAX];
int rmq[11][NMAX][NMAX];

int main() {
	int n,m,i,ans=0,stare,j,bst,k,lg,p,x1,y1;

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

	for(k=1;(1<<k)<=n;++k) {
		for(i=1;i+(1<<k)-1<=n;++i) {
			for(j=1;j+(1<<k)-1<=n;++j) {
				rmq[k][i][j]=max(rmq[k-1][i][j],rmq[k-1][i+(1<<(k-1))][j]);
				rmq[k][i][j]=max(rmq[k][i][j],max(rmq[k-1][i][j+(1<<(k-1))],rmq[k-1][i+(1<<(k-1))][j+(1<<(k-1))]));
			}
		}
	}

	for(i=2;i<=n;++i) preclog[i]=preclog[i/2]+1;

	while(m--) {
		fin>>i>>j>>k;

		lg=preclog[k];
		p=1<<lg;

		x1=i+k-p;
		y1=j+k-p;
		ans=max(rmq[lg][i][j],max(rmq[lg][i][y1],max(rmq[lg][x1][j],rmq[lg][x1][y1])));
		fout<<ans<<'\n';
	}

    return 0;
}