Cod sursa(job #595737)

Utilizator Smaug-Andrei C. Smaug- Data 13 iunie 2011 20:29:34
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define MAXN 500
#define MAXLGN 10

int main(){

  freopen("plantatie.in", "r", stdin);
  freopen("plantatie.out", "w", stdout);

  int N, M, i, j, k, s, a, b;
  static int P[MAXN][MAXN], RMQ[MAXLGN][MAXN][MAXN], lg[MAXN];

  scanf("%d%d", &N, &M);
  for(i=1; i<=N; i++)
    for(j=1; j<=N; j++)
      scanf("%d", &P[i][j]);

  for(i=1; i<=N; i++)
    for(j=1; j<=N; j++)
      RMQ[0][i][j]=P[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++){
	s=1<<(k-1);
	RMQ[k][i][j]=max(max(RMQ[k-1][i][j], RMQ[k-1][i+s][j]), max(RMQ[k-1][i][j+s], RMQ[k-1][i+s][j+s]));
      }

  lg[1]=0;
  for(i=2; i<=N; i++)
    lg[i]=lg[i>>1]+1;

  for(i=1; i<=M; i++){
    scanf("%d%d%d", &a, &b, &k);
    s=lg[k];
    printf("%d\n", max(max(RMQ[s][a][b], RMQ[s][a+k-(1<<s)][b]), max(RMQ[s][a][b+k-(1<<s)], RMQ[s][a+k-(1<<s)][b+k-(1<<s)])));
  }

  return 0;

}