Cod sursa(job #2052587)

Utilizator osiaccrCristian Osiac osiaccr Data 30 octombrie 2017 19:54:06
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#define DEF 510
#define DEF2 11

using namespace std;

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

int n, m, D[DEF][DEF][DEF2], log[DEF];

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

    log[1] = 0;
    for (int i = 2; i <= n; i++)
        log[i] = 1 + log[i / 2];

    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 Max = -1;
                if (D[i][j][k - 1] > Max) {
                    Max = D[i][j][k - 1];
                }
                if (D[i][j + (1 << (k - 1))][k - 1] > Max) {
                    Max = D[i][j + (1 << (k - 1))][k - 1];
                }
                if (D[i + (1 << (k - 1))][j][k - 1] > Max) {
                    Max = D[i + (1 << (k - 1))][j][k - 1];
                }
                if (D[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1] > Max) {
                    Max = D[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1];
                }
                D[i][j][k] = Max;
            }
        }
    }

    for (; m; -- m) {
        int i1, i2, j1, j2, l;
        fin >> i1 >> j1 >> l;
        i2 = i1 + l - 1;
        j2 = j1 + l - 1;
        l = log[l];
        int Max = -1;
        if (D[i1][j1][l] > Max) {
            Max = D[i1][j1][l];
        }
        if (D[i1][j2 - (1 << l) + 1][l] > Max) {
            Max = D[i1][j2 - (1 << l) + 1][l];
        }
        if (D[i2 - (1 << l) + 1][j1][l] > Max) {
            Max = D[i2 - (1 << l) + 1][j1][l];
        }
        if (D[i2 - (1 << l) + 1][j2 - (1 << l) + 1][l] > Max) {
            Max = D[i2 - (1 << l) + 1][j2 - (1 << l) + 1][l];
        }
        fout << Max << '\n';
    }


    return 0;
}