Pagini recente » Cod sursa (job #2280002) | Cod sursa (job #2270939) | Cod sursa (job #170158) | Cod sursa (job #231241) | Cod sursa (job #3354207)
#include <fstream>
#include <vector>
using namespace std;
vector <vector < vector <int>>> r;
vector <vector <int>> a;
vector <int> p2;
int max(int a, int b, int c, int d) {
return max(max(a, b), max(c, d));
}
void precalcul() {
// etapa 1
int n = (int)a.size() - 1;
p2.resize(n + 1);
p2[1] = 0;
for (int i = 2; i <= n; i++) {
p2[i] = 1 + p2[i/2];
}
int m = 0;
while ((1 << (m + 1)) <= n) {
m++;
}
r.resize(m + 1, vector <vector<int>>(n + 1, vector<int>(n + 1, -1)));
r[0] = a;
for (int e = 1; e <= m; e++) {
for (int i = (1 << e); i <= n; i++) {
for (int j = (1 << e); j <= n; j++) {
int p = (1 << (e - 1));
r[e][i][j] = max(r[e - 1][i - p][j - p], r[e - 1][i - p][j],
r[e - 1][i][j - p], r[e - 1][i][j]);
}
}
}
}
int maxim(int l, int c, int lat) {
int k = p2[lat];
int p = (1 << k);
l = l + lat - 1;
c = c + lat - 1;
return max(r[k][l - lat + p][c - lat + p], r[k][l - lat + p][c],
r[k][l][c - lat + p], r[k][l][c]);
}
int main() {
ifstream in("plantatie.in");
ofstream out("plantatie.out");
int n, q;
in >> n >> q;
a.resize(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
in >> a[i][j];
}
}
precalcul();
// etapa 2: raspundem la intrebari
for (int i = 0; i < q; i++) {
int l, c, lat;
in >> l >> c >> lat;
out << maxim(l, c, lat) << "\n";
}
in.close();
out.close();
return 0;
}