Pagini recente » Cod sursa (job #1295143) | Cod sursa (job #270132) | Cod sursa (job #2774745) | Cod sursa (job #2786072) | Cod sursa (job #2987944)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int r[20][505][505];
int a[505][505];
int E[505];
int n, m;
void precalc() {
E[1] = 0;
for (int i = 2; i <= n; i++) {
E[i] = 1 + E[i / 2];
}
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
fin >> a[i][j];
r[0][i][j] = a[i][j];
}
}
precalc();
for (int p = 1; (1 << p) <= n; p++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
r[p][i][j] = r[p - 1][i][j];
int xi = i + (1 << (p - 1));
int xj = j + (1 << (p - 1));
if (xi <= n) {
r[p][i][j] = max(r[p][i][j], r[p - 1][xi][j]);
}
if (xj <= n) {
r[p][i][j] = max(r[p][i][j], r[p - 1][i][xj]);
}
if (xi <= n && xj <= n) {
r[p][i][j] = max(r[p][i][j], r[p - 1][xi][xj]);
}
}
}
}
int st, dr, k;
for (int i = 1; i <= m; i++) {
fin >>st >> dr >> k;
int e = E[k];
int stnou = st + k - (1 << e);
int drnou = dr + k - (1 << e);
int term1= max(r[e][st][dr], r[e][st][drnou]);
int term2 = max(r[e][stnou][drnou], r[e][stnou][dr]);
fout << max(term1, term2)<<'\n';
}
fin.close();
fout.close();
}