Cod sursa(job #2616160)

Utilizator mareadevarIonescu Andrei mareadevar Data 16 mai 2020 20:34:05
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <cmath>

#define MAXN 505

using namespace std;

ifstream f("plantatie.in");
ofstream g("plantatie.out");

int D[MAXN][MAXN][20];
int n, m;

inline void Read() {
    f >> n >> m;

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            f >> D[i][j][0];
        }
    }
}

inline void rmq() {
    int k = log2(n), p2 = 1, nn;

    for (int q = 1; q <= k; q++) {
        nn = n - p2 * 2 + 1;
        for (int i = 1; i <= nn; i++) {
            for (int j = 1; j <= nn; j++) {
                D[i][j][q] = D[i][j][q - 1];
                D[i][j][q] = max(D[i][j][q], D[i][j + p2][q - 1]);
                D[i][j][q] = max(D[i][j][q], D[i + p2][j][q - 1]);
                D[i][j][q] = max(D[i][j][q], D[i + p2][j + p2][q - 1]);
            }
        }
        p2 <<= 1;
    }
}

inline void Query() {
    int sol, kk, p2, x, y, l, xx, yy;

    for (int i = 1; i <= m; i++) {
        f >> x >> y >> l;

        xx = x + l; yy = y + l;

        kk = log2(l); p2 = 1 << kk;

        sol = D[x][y][kk];
        sol = max(sol, D[x][yy - p2][kk]);
        sol = max(sol, D[xx - p2][y][kk]);
        sol = max(sol, D[xx - p2][yy - p2][kk]);
        g << sol << "\n";
    }
}

int main () {
    Read();
    rmq();
    Query();
  return 0;
}