Pagini recente » Cod sursa (job #50587) | Cod sursa (job #1927522) | Cod sursa (job #556717) | Cod sursa (job #2156023) | Cod sursa (job #3229419)
#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];
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] = v[i][j];
}
}
for(int log = 1; log <= LOGMAX; log++){
for(int i = 1; i + (1 << log) - 1 <= N; i++){
for(int j = 1; j + (1 << log) - 1 <= N; j++){
int x1 = i;
int y1 = j;
rmq[i][j][log] = max4(
rmq[x1][y1][log],
rmq[x1][y1 + (1 << (log-1))][log - 1],
rmq[x1 + (1 << (log-1) )][y1][log - 1],
rmq[x1 + (1 << (log-1) )][y1 + (1 << (log-1) )][log - 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 latura){
int log = putereDoiLowerbound(latura);
int x2 = x1 + latura - 1;
int y2 = y1 + latura - 1;
return max4(
rmq[x1][y1][log],
rmq[x1][y2 - (1 << log) + 1][log],
rmq[x2 - (1 << log) + 1][y1][log],
rmq[x2 - (1 << log) + 1][y2 - (1 << log) + 1][log]
);
}
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;
fout << query(x1, y1, latura) << "\n";
}
}