Pagini recente » Cod sursa (job #1991506) | Cod sursa (job #3231855)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
class RMQ2D {
public:
RMQ2D() = delete;
explicit RMQ2D(const vector<vector<int>> &v) : rmq2d(20, vector<vector<int>>(v.size(), vector<int>(v.size()))) {
int n = v.size() - 1;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
rmq2d[0][i][j] = v[i][j];
}
}
for(int p = 1, lat = 2; lat <= n; p++, lat <<= 1) {
for(int i = 1; i <= n - lat + 1; i++) {
for(int j = 1; j <= n - lat + 1; j++) {
int x = i + (lat >> 1);
int y = j + (lat >> 1);
rmq2d[p][i][j] = max({
rmq2d[p-1][i][j], rmq2d[p-1][x][j],
rmq2d[p-1][i][y], rmq2d[p-1][x][y]
});
}
}
}
E.resize(n + 1, 0);
for(int i = 2; i <= n; i++) {
E[i] = 1 + E[i / 2];
}
}
int query(int x, int y, int k) {
int e = E[k];
return max({
rmq2d[e][x][y], rmq2d[e][x][y - (1<<e) + k],
rmq2d[e][x - (1<<e) + k][y], rmq2d[e][x -(1<<e) +k][y - (1<<e) + k]
});
}
private:
vector<vector<vector<int>>> rmq2d;
vector<int> E;
};
#define qwes
const string file = "plantatie";
int main() {
#ifdef qwe
ifstream fin("test.in");
ofstream fout("output.out");
#endif
#ifdef ASD
ifstream fin(file + ".in");
ofstream fout(file + ".out");
#endif
int n, q;
fin >> n >> q;
vector<vector<int>> matrix(n+1, vector<int>(n+1, 0));
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
fin >> matrix[i][j];
}
}
RMQ2D rmq2D{matrix};
for(int i = 0; i < q; i++) {
int a, b, c;
fin >> a >> b >> c;
fout << rmq2D.query(a, b, c) << '\n';
}
return 0;
}