Cod sursa(job #3297690)

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

const int MAXN = 505;
const int LOG = 10;

int n, m;
int a[MAXN][MAXN];
int log2table[MAXN];
int sp[MAXN][MAXN][LOG + 1][LOG + 1];

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

void build_sparse_table() {
    // base case: 1x1 submatrices
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            sp[i][j][0][0] = a[i][j];

    for (int x = 0; (1 << x) <= n; ++x) {
        for (int y = 0; (1 << y) <= n; ++y) {
            if (x == 0 && y == 0)
                continue;
            for (int i = 0; i + (1 << x) <= n; ++i) {
                for (int j = 0; j + (1 << y) <= n; ++j) {
                    if (x == 0) {
                        sp[i][j][x][y] = max(sp[i][j][x][y - 1],
                                             sp[i][j + (1 << (y - 1))][x][y - 1]);
                    } else if (y == 0) {
                        sp[i][j][x][y] = max(sp[i][j][x - 1][y],
                                             sp[i + (1 << (x - 1))][j][x - 1][y]);
                    } else {
                        int m1 = sp[i][j][x - 1][y - 1];
                        int m2 = sp[i + (1 << (x - 1))][j][x - 1][y - 1];
                        int m3 = sp[i][j + (1 << (y - 1))][x - 1][y - 1];
                        int m4 = sp[i + (1 << (x - 1))][j + (1 << (y - 1))][x - 1][y - 1];
                        sp[i][j][x][y] = max(max(m1, m2), max(m3, m4));
                    }
                }
            }
        }
    }
}

int query(int x, int y, int k) {
    x--;
    y--;
    int lx = log2table[k];
    int ly = log2table[k];
    int dx = k - (1 << lx);
    int dy = k - (1 << ly);

    int m1 = sp[x][y][lx][ly];
    int m2 = sp[x + dx][y][lx][ly];
    int m3 = sp[x][y + dy][lx][ly];
    int m4 = sp[x + dx][y + dy][lx][ly];

    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;
}