Pagini recente » Cod sursa (job #647351) | Cod sursa (job #2572296) | Cod sursa (job #649088) | Cod sursa (job #1454375) | Cod sursa (job #967782)
Cod sursa(job #967782)
#include <fstream>
using namespace std;
const int MAX_N = 502;
int N, M;
int A[MAX_N][MAX_N], B[MAX_N][MAX_N][11], log[MAX_N];
int main(){
ifstream f("plantatie.in");
ofstream g("plantatie.out");
f >> N >> M;
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
f >> A[i][j];
for(int i = 2; i < MAX_N; ++i){
int a = 1, n = 0;
while(a < i)
a *= 2, ++n;
if(a != i)
--n;
log[i] = n;
}
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= N; ++j)
B[i][j][0] = A[i][j];
for(int k = 1; (1 << k) <= N; ++k)
for(int i = 1; i + (1 << k) - 1 <= N; ++i)
for(int j = 1; j + (1 << k) - 1 <= N; ++j){
B[i][j][k] = max(B[i][j][k-1], B[i+(1 << (k-1))][j][k-1]);
B[i][j][k] = max(B[i][j][k], B[i][j+(1 << (k-1))][k-1]);
B[i][j][k] = max(B[i][j][k], B[i+(1 << (k-1))][j+(1 << (k-1))][k-1]);
}
for(int q = 1, x, y, k, l, ans; q <= M; ++q){
f >> x >> y >> k;
l = log[k];
ans = max(B[x][y][l], B[x+k-(1 << l)][y][l]);
ans = max(ans, B[x][y+k-(1 << l)][l]);
ans = max(ans, B[x+k-(1 << l)][y+k-(1 << l)][l]);
g << ans << '\n';
}
f.close();
g.close();
return 0;
}