Cod sursa(job #1240226)

Utilizator hrazvanHarsan Razvan hrazvan Data 10 octombrie 2014 18:52:35
Problema Plantatie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#define MAXN 500
#define MAXLG 9
int rmq[MAXN + 1][MAXN + 1][MAXLG + 1], lg[MAXN + 1];

int max2( int a, int b ){
  return a > b ? a : b;
}

int max4( int a, int b, int c, int d ){
  return max2( max2( a, b ), max2( c, d ) );
}

int main(){
  FILE *in = fopen( "plantatie.in", "r" );
  int n, m, i, j, k, x, l, c;
  fscanf(in, "%d%d", &n, &m);
  for ( i = 1; i <= n; i++ ){
    for ( j = 1; j <= n; j++ ){
      fscanf( in, "%d", &rmq[i][j][0] );
      for ( k = 1; k <= MAXLG; k++){
        x = 1 << (k - 1);
        l = max2(i - x, 1);
        c = max2(j - x, 1);
        rmq[i][j][k] = max4( rmq[i][j][k - 1], rmq[l][j][k - 1], rmq[i][c][k - 1], rmq[l][c][k - 1] );
      }
      k = 1;
    }
  }
  for ( i = 2; i <= MAXN; i++){
    lg[i] = lg[i >> 1] + 1;
  }
  for ( i = 1; i <= MAXLG && 1 << i <= n; i++ ){
    lg[1 << i]--;
  }
  FILE *out = fopen( "plantatie.out", "w" );
  int lat, lin, col;
  for ( i = 1; i <= m; i++ ){
    fscanf( in, "%d%d%d", &lin, &col, &lat );
    x = 1 << lg[lat];
    l = lin + lat - 1;
    c = col + lat - 1;
    fprintf( out, "%d\n", max4( rmq[lin + x - 1][col + x - 1][lg[lat]], rmq[l][col + x - 1][lg[lat]],
                                rmq[lin + x - 1][c][lg[lat]], rmq[l][c][lg[lat]] ) );
  }
  fclose( in );
  fclose( out );
  return 0;
}