Cod sursa(job #1775506)

Utilizator TincaMateiTinca Matei TincaMatei Data 10 octombrie 2016 15:15:16
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>

const int MAX_N = 500;
const int MAX_LOG = 9;

int rmq[MAX_N][MAX_N][1+MAX_LOG];
int log[MAX_N];

int min(int a, int b) {
  if(a < b)
    return a;
  return b;
}

int max4(int a, int b, int c, int d) {
  int r;
  r = a;
  if(b > r)
    r = b;
  if(c > r)
    r = c;
  if(d > r)
    r = d;
  return r;
}

int main() {
  int n, m, l, c, i, k, lg, l2, c2;

  for(i = 2; i <= MAX_N; i++) {
    log[i] = 1 + log[i / 2];
  }

  FILE *fin = fopen("plantatie.in", "r");
  FILE *fout = fopen("plantatie.out", "w");
  fscanf(fin, "%d%d", &n, &m);
  for(l = 0; l < n; l++)
    for(c = 0; c < n; c++) {
      fscanf(fin, "%d", &rmq[l][c][0]);
      for(i = 1; i <= log[min(l, c) + 1]; i++)
        rmq[l][c][i] = max4(rmq[l][c][i - 1], rmq[l - (1 << (i - 1))][c][i - 1],
                            rmq[l][c - (1 << (i - 1))][i - 1],
                            rmq[l - (1 << (i - 1))][c - (1 << (i - 1))][i - 1]);
    }
  for(i = 0; i < m; i++) {
    fscanf(fin, "%d%d%d", &l, &c, &k);
    l--;
    c--;
    l2 = l + k - 1;
    c2 = c + k - 1;
    lg = log[k];
    fprintf(fout, "%d\n", max4(rmq[l2][c2][lg], rmq[l+(1<<lg)-1][c2][lg],
                               rmq[l2][c+(1<<lg)-1][lg],
                               rmq[l+(1<<lg)-1][c+(1<<lg)-1][lg]));
  }
  fclose(fin);
  fclose(fout);
  return 0;
}