Cod sursa(job #2515330)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 28 decembrie 2019 13:15:49
Problema Plantatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,a[505][505],rmq[505][505][11],lg[505];
const int lim=1005;char sir[lim];int u=lim-1;
void nextt () {
	++u;
	if(u==lim)
		fread(sir,1,lim,stdin),u=0;
}
void citeste (int &nr) {
	nr=0;
	for(;sir[u]<'0' || sir[u]>'9';nextt());
	for(;sir[u]>='0' && sir[u]<='9';nextt())
		nr=nr*10+sir[u]-'0';
}
void build_rmq () {
	for(int k=1;(1<<k)<=n;++k)
		for(int i=1;i+(1<<k)-1<=n;++i)
			for(int j=1;j+(1<<k)-1<=n;++j)
				rmq[i][j][k]=max(max(rmq[i][j][k-1],rmq[i+(1<<(k-1))][j][k-1]),max(rmq[i][j+(1<<(k-1))][k-1],rmq[i+(1<<(k-1))][j+(1<<(k-1))][k-1]));
}
int querrys (int i, int j, int k) {
	return max(max(rmq[i][j][lg[k]],rmq[i+k-(1<<lg[k])][j][k]),max(rmq[i][j+k-(1<<lg[k])][lg[k]],rmq[i+k-(1<<lg[k])][j+k-(1<<lg[k])][lg[k]]));
}
int main () {
	int nr1,nr2,nr3;
	freopen("plantatie.in","r",stdin);
	freopen("plantatie.out","w",stdout);
	for(int i=2;i<=505;++i)
		lg[i]=lg[(i>>1)]+1;
	citeste(n);citeste(m);++m;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			citeste(a[i][j]),rmq[i][j][0]=a[i][j];
	build_rmq();
	while(--m) {
		citeste(nr1);citeste(nr2);citeste(nr3);
		printf("%d\n", querrys(nr1,nr2,nr3));
	}
	return 0;
}