Pagini recente » Cod sursa (job #2518665) | Cod sursa (job #3181322) | Cod sursa (job #2877597) | Cod sursa (job #557311) | Cod sursa (job #3134204)
#include <fstream>
#include <vector>
using namespace std;
string file = "plantatie";
ifstream cin(file + ".in");
ofstream cout(file + ".out");
const int N = 500;
int dp[9][N + 1][N + 1], np;
vector<int> powers;
inline void calculatePowers(int n) {
powers.push_back(1);
for (int i = 2; i <= n; i = i << 1) {
powers.push_back(i);
}
np = powers.size();
}
inline int binarySearch(int x) {
int left = 1, right = np - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (powers[mid] <= x) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return right;
}
inline void rmq(int n) {
for (int k = 1; k < np; k++) {
for (int i = powers[k]; i <= n; i++) {
for (int j = powers[k]; j <= n; j++) {
dp[k][i][j] = max(max(dp[k - 1][i][j], dp[k - 1][i - powers[k - 1]][j]), max(dp[k - 1][i][j - powers[k - 1]], dp[k - 1][i - powers[k - 1]][j - powers[k - 1]]));
}
}
}
}
inline int query(int i, int j, int k) {
int e = binarySearch(k), x = powers[e];
return max(max(dp[e][i + x - 1][j + x - 1], dp[e][i + k - 1][j + x - 1]), max(dp[e][i + x - 1][j + k - 1], dp[e][i + k - 1][j + k - 1]));
}
int main() {
int n, m, x, y, z;
cin >> n >> m;
calculatePowers(n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> dp[0][i][j];
}
}
rmq(n);
for (int i = 1; i <= m; i++) {
cin >> x >> y >> z;
cout << query(x, y, z) << '\n';
}
}