Cod sursa(job #1734784)

Utilizator cella.florescuCella Florescu cella.florescu Data 28 iulie 2016 11:30:26
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <cstdio>
#define MAXN 500
#define MAXLOG 8

using namespace std;

inline int maxim(int a, int b, int c, int d){
  if(a<b)
    a=b;
  if(a<c)
    a=c;
  if(a<d)
    a=d;
  return a;
}

int rmq[MAXLOG+1][MAXN+1][MAXN+1], log[MAXN+1];

int main()
{
    FILE *fin, *fout;
    int n, m, i, j, k, l, aux, x, y;
    for(i=2; i<=MAXN; i++)
      log[i]=log[i>>1]+1;
    fin=fopen("plantatie.in", "r");
    fscanf(fin, "%d%d", &n, &m);
    for(i=1; i<=n; i++)
      for(j=1; j<=n; j++)
        fscanf(fin, "%d", &rmq[0][i][j]);
    for(k=1; (1<<k)<=n; k++){
      l=(1<<(k-1));
      aux=(l<<1);
      for(i=1; i<=n-aux+1; i++)
        for(j=1; j<=n-aux+1; j++)
          rmq[k][i][j]=maxim(rmq[k-1][i][j], rmq[k-1][i+l][j], rmq[k-1][i][j+l], rmq[k-1][i+l][j+l]);
    }
    fout=fopen("plantatie.out", "w");
    for(i=0; i<m; i++){
      fscanf(fin, "%d%d%d", &x, &y, &k);
      l=(1<<log[k]);
      fprintf(fout, "%d\n", maxim(rmq[log[k]][x][y], rmq[log[k]][x][y+k-l], rmq[log[k]][x+k-l][y], rmq[log[k]][x+k-l][y+k-l]));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}