Pagini recente » Cod sursa (job #714353) | Cod sursa (job #3200738) | Cod sursa (job #2299455) | Cod sursa (job #2122971) | Cod sursa (job #1006192)
#include <cstdio>
#define Nmax 512
#define inf 0x3f3f3f3f
using namespace std;
int N, M, a[Nmax][Nmax], lg[Nmax], p[Nmax], v[Nmax][Nmax][10];
inline int max(int a, int b, int c = inf, int d = inf){
int m = a;
if(b > m)
m = b;
if(c > b)
m = c;
if(d > m)
m = d;
return m;
}
int main(){
freopen("plantatie.in", "r", stdin);
freopen("plantatie.out", "w", stdout);
scanf("%d%d",&N,&M);
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
scanf("%d", &a[i][j]);
lg[1] = 0;
int pw = 1;
for(int i = 1; i <= N; ++i){
lg[i] = lg[i - 1];
if( i > pw ){
lg[i]++;
pw *= 2;
}
}
//Precalculam
//v[i][j][k] -> coltul in i,j, lungime latura k
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
v[i][j][0] = a[i][j];
pw = 2;
p[0] = 1;
for(int k = 1; pw <= N; k++, pw*=2){
for(int i = 1; i <= N - pw + 1; ++i)
for(int j =1; j <= N - pw + 1; ++j){
int lastPow = pw/2;
v[i][j][k] = max( v[i][j][k-1], v[i+lastPow][j][k-1], v[i][j+lastPow][k-1], v[i+lastPow][j+lastPow][k-1] );
}
p[k] = pw;
}
//Query-uri
for(int i = 1; i <= M; ++i){
int x, y, k;
scanf("%d%d%d",&x,&y,&k);
int log = lg[k] - 1;
int sol = max( v[x][y][log], v[x + k - p[log]][y][log], v[x][y + k - p[log]][log], v[x + k - p[log]][y + k - p[log]][log]);
printf("%d\n", sol);
}
return 0;
}