Cod sursa(job #3358802)

Utilizator alexlazuLazureanu Alexandru Ioan alexlazu Data 20 iunie 2026 16:29:12
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 505;

int n, Q;
int mat[N][N];
int rmq[10][10][N][N];

int main() {
    ifstream cin("plantatie.in");
    ofstream cout("plantatie.out");

    cin >> n >> Q;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            cin >> mat[i][j];

    // base case
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            rmq[0][0][i][j] = mat[i][j];

    int LOG = log2(n);

    // build
    for (int l = 0; l <= LOG; l++) {
        for (int k = 0; k <= LOG; k++) {

            if (l == 0 && k == 0) continue;

            for (int i = 1; i + (1 << l) - 1 <= n; i++) {
                for (int j = 1; j + (1 << k) - 1 <= n; j++) {

                    if (l == 0) {
                        rmq[l][k][i][j] = min(
                            rmq[l][k - 1][i][j],
                            rmq[l][k - 1][i][j + (1 << (k - 1))]
                        );
                    }
                    else if (k == 0) {
                        rmq[l][k][i][j] = min(
                            rmq[l - 1][k][i][j],
                            rmq[l - 1][k][i + (1 << (l - 1))][j]
                        );
                    }
                    else {
                        rmq[l][k][i][j] = min({
                            rmq[l - 1][k - 1][i][j],
                            rmq[l - 1][k - 1][i + (1 << (l - 1))][j],
                            rmq[l - 1][k - 1][i][j + (1 << (k - 1))],
                            rmq[l - 1][k - 1][i + (1 << (l - 1))][j + (1 << (k - 1))]
                            });
                    }
                }
            }
        }
    }

    while (Q--) {
        int x, y, k;
        cin >> x >> y >> k;

        int l = log2(k);

        int dx = k - (1 << l);
        int dy = k - (1 << l);

        int ans = min({
            rmq[l][l][x][y],
            rmq[l][l][x + dx][y],
            rmq[l][l][x][y + dy],
            rmq[l][l][x + dx][y + dy]
            });

        cout << ans << "\n";
    }
}