Cod sursa(job #3297692)

Utilizator gabyyy____23Gabriela Madalina Pirvulescu gabyyy____23 Data 23 mai 2025 15:10:12
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

const int MAXN = 505;
const int LOG = 9;

int n, m;
int a[MAXN][MAXN];
int sp[LOG + 1][MAXN][MAXN];  // [log][i][j]
int log2table[MAXN];

void precompute_logs() {
    log2table[1] = 0;
    for (int i = 2; i < MAXN; ++i)
        log2table[i] = log2table[i / 2] + 1;
}

void build_sparse_table() {
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            sp[0][i][j] = a[i][j];

    for (int k = 1; (1 << k) <= n; ++k) {
        int len = 1 << (k - 1);
        for (int i = 0; i + (1 << k) <= n; ++i) {
            for (int j = 0; j + (1 << k) <= n; ++j) {
                int m1 = sp[k - 1][i][j];
                int m2 = sp[k - 1][i + len][j];
                int m3 = sp[k - 1][i][j + len];
                int m4 = sp[k - 1][i + len][j + len];
                sp[k][i][j] = max(max(m1, m2), max(m3, m4));
            }
        }
    }
}

int query(int i, int j, int k) {
    i--;
    j--;
    int p = log2table[k];
    int len = 1 << p;
    int i2 = i + k - len;
    int j2 = j + k - len;

    int m1 = sp[p][i][j];
    int m2 = sp[p][i2][j];
    int m3 = sp[p][i][j2];
    int m4 = sp[p][i2][j2];

    return max(max(m1, m2), max(m3, m4));
}

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

    fin >> n >> m;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            fin >> a[i][j];

    precompute_logs();
    build_sparse_table();

    for (int q = 0; q < m; ++q) {
        int i, j, k;
        fin >> i >> j >> k;
        fout << query(i, j, k) << '\n';
    }

    return 0;
}