Pagini recente » Cod sursa (job #622057) | Cod sursa (job #1690844) | Cod sursa (job #1823769) | Cod sursa (job #1133332) | Cod sursa (job #970066)
Cod sursa(job #970066)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
const char INAME[] = "plantatie.in";
const char ONAME[] = "plantatie.out";
const int NMax = 510;
const int LogMax = 10;
ifstream fin("plantatie.in");
ofstream fout(ONAME);
int N, M, A[NMax][NMax];
int R[LogMax][NMax][NMax];
int LG[NMax];
void Read() {
fin >> N >> M;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
fin >> A[i][j];
}
void Solve() {
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
R[0][i][j] = A[i][j];
for (int lg = 1; lg < LogMax; lg++)
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++) {
if (i + (1 << lg) - 1 > N || j + (1 << lg) - 1 > N)
break;
int mdl = i + (1 << (lg - 1));
int mdc = j + (1 << (lg - 1));
R[lg][i][j] = max(
max(
R[lg - 1][i][j],
R[lg - 1][mdl][j]
)
,
max(
R[lg - 1][i][mdc],
R[lg - 1][mdl][mdc]
)
);
}
LG[2] = 1;
for (int i = 3; i < NMax; i++)
LG[i] = LG[i / 2] + 1;
}
inline int query(int x, int y, int L) {
int lg = LG[L];
int mdl = x + L - 1 - (1 << lg) + 1;
int mdc = y + L - 1 - (1 << lg) + 1;
return max(
max(
R[lg][x][y],
R[lg][mdl][y]
)
,
max(
R[lg][x][mdc],
R[lg][mdl][mdc]
)
);
}
void Write() {
for (int i = 1; i <= M; i++) {
int X, Y, L;
fin >> X >> Y >> L;
fout << query(X, Y, L) << '\n';
}
}
int main() {
Read(); Solve(); Write();
}