Pagini recente » Cod sursa (job #2305499) | Cod sursa (job #2156136) | Cod sursa (job #280802) | Cod sursa (job #1606225) | Cod sursa (job #2985029)
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
constexpr int LIM = 505;
constexpr int LG = 10;
int N, M, i, j, k, q, mat[LIM][LIM];
int RMQ[LG][LIM][LIM], lg2[LIM];
static inline void prepare_RMQ() {
lg2[1] = 0;
for (i = 2; i <= N; ++i)
lg2[i] = lg2[i / 2] + 1;
for (i = 1; i <= N; ++i)
for (j = 1; j <= N; ++j) {
RMQ[0][i][j] = mat[i][j];
for (k = 1; (1 << k) <= min(i, j); ++k) {
const int len = (1 << (k - 1));
const int ans1 = max(RMQ[k - 1][i][j], RMQ[k - 1][i - len][j - len]);
const int ans2 = max(RMQ[k - 1][i - len][j], RMQ[k - 1][i][j - len]);
RMQ[k][i][j] = max(ans1, ans2);
}
}
}
static inline int query_RMQ(int x, int y, int len) {
const int lg_len = lg2[len];
const int offset = len - (1 << lg_len);
const int ans1 = max(RMQ[lg_len][x][y], RMQ[lg_len][x - offset][y - offset]);
const int ans2 = max(RMQ[lg_len][x - offset][y], RMQ[lg_len][x][y - offset]);
return max(ans1, ans2);
}
int main() {
fin >> N >> M;
for (i = 1; i <= N; ++i)
for (j = 1; j <= N; ++j)
fin >> mat[i][j];
prepare_RMQ();
for (q = 1; q <= M; ++q) {
fin >> i >> j >> k;
fout << query_RMQ(i + k - 1, j + k - 1, k) << '\n';
}
fin.close();
fout.close();
return 0;
}