Cod sursa(job #3230337)

Utilizator DenisMiricaDenis Mirica DenisMirica Data 20 mai 2024 17:01:02
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>

using namespace std;

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

int n, m, row, col, qx, qy, querySize, endX, endY, logSize, power;
int logVals[505], sparseTable[20][505][505];

int main() {
    fin >> n >> m;
    logVals[1] = 0;
    for (row = 2; row <= n; ++row) {
        logVals[row] = logVals[row / 2] + 1;
    }
    for (row = 1; row <= n; ++row) {
        for (col = 1; col <= n; ++col) {
            fin >> sparseTable[0][row][col];
        }
    }
    for (int level = 1; level <= logVals[n] + 1; ++level) {
        for (row = 1; row + (1 << (level - 1)) <= n; ++row) {
            for (col = 1; col + (1 << (level - 1)) <= n; ++col) {
                sparseTable[level][row][col] = max(
                    max(sparseTable[level - 1][row][col], sparseTable[level - 1][row + (1 << (level - 1))][col]),
                    max(sparseTable[level - 1][row + (1 << (level - 1))][col + (1 << (level - 1))], sparseTable[level - 1][row][col + (1 << (level - 1))])
                );
            }
        }
    }
    for (int query = 1; query <= m; ++query) {
        fin >> qx >> qy >> querySize;
        endX = qx + querySize - 1;
        endY = qy + querySize - 1;
        logSize = logVals[querySize];
        power = (1 << logSize);
        fout << max(
            max(sparseTable[logSize][qx][qy], sparseTable[logSize][endX - power + 1][qy]),
            max(sparseTable[logSize][endX - power + 1][endY - power + 1], sparseTable[logSize][qx][endY - power + 1])
        ) << "\n";
    }
    return 0;
}