Pagini recente » Borderou de evaluare (job #3317597) | Borderou de evaluare (job #1479187) | Borderou de evaluare (job #2465419) | Borderou de evaluare (job #2859736) | Cod sursa (job #3358801)
#include <bits/stdc++.h>
using namespace std;
#define in("plantatie.in");
#define out("plantatie.out");
#define cin in
#define cout out
const int N = 505;
int n, Q;
int mat[N][N];
int rmq[10][10][N][N];
int main() {
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 lx = log2(k);
int ly = log2(k);
int dx = k - (1 << lx);
int dy = k - (1 << ly);
int ans = min({
rmq[lx][ly][x][y],
rmq[lx][ly][x + dx][y],
rmq[lx][ly][x][y + dy],
rmq[lx][ly][x + dx][y + dy]
});
cout << ans << "\n";
}
}