Cod sursa(job #3160081)

Utilizator dragoncrackCandidatu Mario Luca dragoncrack Data 22 octombrie 2023 21:06:45
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <climits>

#define DIM 501

using namespace std;

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

int n, m;
int r[10][DIM][DIM];
int E[DIM];

int max4(int a, int b, int c, int d) {
    return max(max(a, b), max(c, d));
}

void build() {
    for (int power = 1; (1 << power) <= n; power++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                r[power][i][j] = r[power - 1][i][j];
                int i2 = i + (1 << (power - 1));
                int j2 = j + (1 << (power - 1));
                if (i2 <= n && j2 <= n) {
                    r[power][i][j] = max4(r[power][i][j], r[power - 1][i][j2], r[power - 1][i2][j], r[power - 1][i2][j2]);
                }
            }
        }
    }
}

void buildPowerArray() {
    E[1] = 0;
    for (int i = 2; i <= n; i++) {
        E[i] = 1 + E[i / 2];
    }
}

int query(int i1, int j1, int k) {
    int power = E[k];

    int i2 = i1 + (k - (1 << power));
    int j2 = j1 + (k - (1 << power));

    int a = r[power][i1][j1];
    int b = r[power][i1][j2];
    int c = r[power][i2][j1];
    int d = r[power][i2][j2];

    return max4(a, b, c, d);
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            fin >> r[0][i][j];
        }
    }
    build();
    buildPowerArray();
    for (int i = 1; i <= m; i++) {
        int i1, j1, k;
        fin >> i1 >> j1 >> k;
        fout << query(i1, j1, k) << "\n";
    }
}