Cod sursa(job #2395945)

Utilizator Robert_VRVRobert Vadastreanu Robert_VRV Data 3 aprilie 2019 08:37:49
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <algorithm>
#include <stdio.h>

const int MAX_N = 500;

int rmq[1 + MAX_N][1 + MAX_N][10];
int lg[1 + MAX_N];

int main() {

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

  int n, Q;
  scanf("%d%d", &n, &Q);
  for (int i = 1; i <= n; i++)
	for (int j = 1; j <= n; j++)
	  scanf("%d", &rmq[i][j][0]);
  lg[1] = 0;
  for (int i = 2; i <= n; i++)
	lg[i] = lg[i / 2] + 1;
  for (int k = 1; (1 << k) < n; k++)
	for (int i = 1; i + (1 << k) - 1 <= n; i++)
      for (int j = 1; j + (1 << k) - 1 <= n; j++) {
        int size = 1 << (k - 1);
        rmq[i][j][k] = std::max(std::max(rmq[i][j][k - 1], rmq[i + size][j][k - 1]),
								std::max(rmq[i][j + size][k - 1], rmq[i + size][j + size][k - 1]));
      }
  for (int q = 0; q < Q; q++) {
    int x, y, k;
    scanf("%d%d%d", &x, &y, &k);
    int pow = lg[k - 1];
    int size = (1 << pow);
    printf("%d\n", std::max(std::max(rmq[x][y][pow], rmq[x][y - size + k][pow]),
							std::max(rmq[x - size + k][y][pow], rmq[x - size + k][y - size + k][pow])));
  }

  return 0;
}