Pagini recente » Cod sursa (job #1308410) | Cod sursa (job #3297690)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
const int MAXN = 505;
const int LOG = 10;
int n, m;
int a[MAXN][MAXN];
int log2table[MAXN];
int sp[MAXN][MAXN][LOG + 1][LOG + 1];
void precompute_logs() {
log2table[1] = 0;
for (int i = 2; i < MAXN; ++i)
log2table[i] = log2table[i / 2] + 1;
}
void build_sparse_table() {
// base case: 1x1 submatrices
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
sp[i][j][0][0] = a[i][j];
for (int x = 0; (1 << x) <= n; ++x) {
for (int y = 0; (1 << y) <= n; ++y) {
if (x == 0 && y == 0)
continue;
for (int i = 0; i + (1 << x) <= n; ++i) {
for (int j = 0; j + (1 << y) <= n; ++j) {
if (x == 0) {
sp[i][j][x][y] = max(sp[i][j][x][y - 1],
sp[i][j + (1 << (y - 1))][x][y - 1]);
} else if (y == 0) {
sp[i][j][x][y] = max(sp[i][j][x - 1][y],
sp[i + (1 << (x - 1))][j][x - 1][y]);
} else {
int m1 = sp[i][j][x - 1][y - 1];
int m2 = sp[i + (1 << (x - 1))][j][x - 1][y - 1];
int m3 = sp[i][j + (1 << (y - 1))][x - 1][y - 1];
int m4 = sp[i + (1 << (x - 1))][j + (1 << (y - 1))][x - 1][y - 1];
sp[i][j][x][y] = max(max(m1, m2), max(m3, m4));
}
}
}
}
}
}
int query(int x, int y, int k) {
x--;
y--;
int lx = log2table[k];
int ly = log2table[k];
int dx = k - (1 << lx);
int dy = k - (1 << ly);
int m1 = sp[x][y][lx][ly];
int m2 = sp[x + dx][y][lx][ly];
int m3 = sp[x][y + dy][lx][ly];
int m4 = sp[x + dx][y + dy][lx][ly];
return max(max(m1, m2), max(m3, m4));
}
int main() {
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
fin >> n >> m;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
fin >> a[i][j];
precompute_logs();
build_sparse_table();
for (int q = 0; q < m; ++q) {
int i, j, k;
fin >> i >> j >> k;
fout << query(i, j, k) << '\n';
}
return 0;
}