Pagini recente » Cod sursa (job #470237) | Cod sursa (job #237919) | Cod sursa (job #649955) | Cod sursa (job #273198) | Cod sursa (job #3229411)
#include <bits/stdc++.h>
#define NMAX 500
#define LOGMAX 9
using namespace std;
ifstream fin ("plantatie.in");
ofstream fout ("plantatie.out");
int N, nrQ;
int v[NMAX + 1][NMAX + 1];
int rmq[NMAX + 1][NMAX + 1][LOGMAX + 1][LOGMAX + 1];
int max4(int a, int b, int c, int d){
return max( a, max( b, max(c,d) ) );
}
void buildRMQ(){
for(int i = 1; i <= N; i++){
for(int j = 1; j <= N; j++){
rmq[i][j][0][0] = v[i][j];
}
}
for(int vertlog = 1; vertlog <= LOGMAX; vertlog++){
for(int orilog = 1; orilog <= LOGMAX; orilog++){
for(int i = 1; i + (1 << vertlog) - 1 <= N; i++){
for(int j = 1; j + (1 << orilog) - 1 <= N; j++){
int x1 = i;
int y1 = j;
rmq[i][j][vertlog][orilog] = max4(
rmq[x1][y1][vertlog - 1][orilog - 1],
rmq[x1][y1 + (1 << (orilog-1))][vertlog - 1][orilog - 1],
rmq[x1 + (1 << (vertlog-1) )][y1][vertlog - 1][orilog - 1],
rmq[x1 + (1 << (vertlog-1) )][y1 + (1 << (orilog-1) )][vertlog - 1][orilog - 1]
);
}
}
}
}
}
int putereDoiLowerbound(int x){
int lo = -1;
int hi = LOGMAX + 1;
while(hi - lo > 1){
int mid = lo + (hi - lo) / 2;
if( (1 << mid) <= x ){
lo = mid;
}
else {
hi = mid;
}
}
return lo;
}
int query(int x1, int y1, int x2, int y2){
int vertlog = putereDoiLowerbound(x2 - x1 + 1);
int orilog = putereDoiLowerbound(y2 - y1 + 1);
return max4(
rmq[x1][y1][vertlog][orilog],
rmq[x1][y2 - (1 << orilog) + 1][vertlog][orilog],
rmq[x2 - (1 << vertlog) + 1][y1][vertlog][orilog],
rmq[x2 - (1 << vertlog) + 1][y2 - (1 << orilog) + 1][vertlog][orilog]
);
}
int main()
{
fin >> N >> nrQ;
for(int i = 1; i <= N; i++){
for(int j = 1; j <= N; j++){
fin >> v[i][j];
}
}
buildRMQ();
for(int q = 1; q <= nrQ; q++){
int x1, y1;
fin >> x1 >> y1;
int latura;
fin >> latura;
int x2 = x1 + latura - 1;
int y2 = y1 + latura - 1;
fout << query(x1, y1, x2, y2) << "\n";
}
}