Cod sursa(job #335040)

Utilizator szabotamasSzabo Tamas szabotamas Data 28 iulie 2009 14:30:28
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>

#define NMAX 501
#define LMAX 10

using namespace std;

int t[NMAX][NMAX][LMAX], lg[NMAX], i, j, k, w, r, q, maxx, maxy, I, J, K, n, m;

int max (int a,int b)  
{  
    if (a>b)  
        return a;  
    return b;  
}  

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

int rezolve(int &I, int &J, int &K){
	maxx=-1;
	q=lg[K];
		maxx=max(max(t[I][J][q],t[I][J+K-(1<<q)][q]) ,max(t[I+K-(1<<q)][J][q],t[I+K-(1<<q)][J+K-(1<<q)][q]));
	return maxx;
}

int main(){
	freopen("plantatie.in","r", stdin);
	freopen("plantatie.out", "w", stdout);
		scanf("%d %d", &n, &m);
		for (i=1; i<=n; i++){
			for (j=1; j<=n; j++){
				scanf("%d ",&t[i][j][0]);
			}
		}
		lg[1]=0;
		for (i=2; i<=n; i++){
			lg[i]=lg[i/2]+1;
		}
		build();
		for (w=1; w<=m; w++){
			scanf("%d %d %d", &I,&J,&K);
			printf("%d\n", rezolve(I,J,K));
		}
	return 0;
}