Cod sursa(job #2035949)

Utilizator CammieCamelia Lazar Cammie Data 9 octombrie 2017 23:34:02
Problema Plantatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <cmath>

#define MAXN 505

using namespace std;

ifstream fin("planatie.in");
ofstream fout("plantatie.out");

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

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

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            fin >> 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] = max(D[i][j][q - 1], 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]);

                //fout << D[i][j][q] << " ";
            }
            //fout << "\n";
        }
        p2 <<= 1;
       // fout << "\n";
    }
}

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

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

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

        kk = log2(l);
        p2 = 1 << kk;
        sol = max(D[x][y][kk], D[x][yy - p2 + 1][kk]);
        sol = max(sol, D[xx - p2 + 1][y][kk]);
        sol = max(sol, D[xx - p2 + 1][yy - p2 + 1][kk]);
        fout << sol << "\n";
    }
}

int main () {
    Read();
    rmq();
    Query();

    fin.close(); fout.close(); return 0;
}