Cod sursa(job #3220836)

Utilizator Radu_VasileRadu Vasile Radu_Vasile Data 4 aprilie 2024 22:07:52
Problema Plantatie Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#define MAXN 500
#define LOG 9
int rmax[LOG][MAXN + 1][MAXN + 1];
char e[MAXN + 1];
static inline int max(int a, int b){
  return a > b ? a : b;
}
static inline int query(int l, int c, int lat){
  int p = e[lat];
  int l1 = l + lat - (1 << p);
  int c1 = c + lat - (1 << p);
  return max(max(rmax[p][l][c], rmax[p][l1][c]), max(rmax[p][l][c1], rmax[p][l1][c1]));
}
int main(){
  FILE *fin, *fout;
  int n, q, l, c, l1, c1, lat, p, i;;
  fin = fopen( "plantatie.in", "r" );

  fscanf ( fin, "%d%d", &n, &q );
  for ( l = 1; l <= n; l++ ){
    for ( c = 1; c <= n; c++ )
      fscanf( fin, "%d", &rmax[0][l][c] );
  }
  for( p = 1; (1 << p) <= n; p++ ){
    for( l = 1; l + (1 << p) - 1 <= n; l++ ){
      for( c = 1; c + (1 << p) - 1 <= n; c++ ){
        l1 = l + (1 << (p - 1));
        c1 = c + (1 << (p - 1));
        rmax[p][l][c] = max(max(rmax[p - 1][l][c], rmax[p - 1][l][c1]), max(rmax[p - 1][l1][c], rmax[p - 1][l1][c1]));
      }
    }
  }
  for( i = 2; i <= n; i++ )
    e[i] = 1 + e[i / 2];

  fout = fopen( "plantatie.out", "w" );

  for( i = 0; i < q; i++ ){
    fscanf(fin, "%d%d%d", &l, &c, &lat);
    p = e[lat];
    l1 = l + lat - (1 << p);
    c1 = c + lat - (1 << p);
    fprintf(fout, "%d\n", query(l, c, lat));
  }

  fclose( fin );
  fclose( fout );
  return 0;
}