Pagini recente » Cod sursa (job #972786) | Cod sursa (job #1139449) | Cod sursa (job #933441) | Cod sursa (job #2631095) | Cod sursa (job #832339)
Cod sursa(job #832339)
#include <fstream>
#define MAX 505
#define LMAX 9
using namespace std;
int V[MAX][MAX], dp[LMAX][MAX][MAX], log[MAX];
int N, M, X, Y, K;
void preprocess()
{
for(int i = 2; i <= N; i++) log[i] = log[i >> 1] + 1;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++) dp[0][i][j] = V[i][j];
for(int L = 1; L <= log[N]; L++)
for(int i = 1; i <= N - (1 << L) + 1; i++)
for(int j = 1; j <= N - (1 << L) + 1; j++)
dp[L][i][j] = max(max(dp[L - 1][i][j], dp[L - 1][i][j + (1 << (L - 1))]),
max(dp[L - 1][i + (1 << (L - 1))][j],
dp[L - 1][i + (1 << (L - 1))][j + (1 << (L - 1))]));
}
int query(int X, int Y, int K)
{
int maxim1 = -1, maxim2 = -1, lg = log[K];
maxim1 = max(dp[lg][X][Y], dp[lg][X + K - (1 << lg)][Y]);
maxim2 = max(dp[lg][X][Y + K - (1 << lg)], dp[lg][X + K - (1 << lg)][Y + K - (1 << lg)]);
return max(maxim1, maxim2);
}
int main()
{
ifstream in("plantatie.in"); in>>N>>M;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++) in>>V[i][j];
preprocess();
ofstream out("plantatie.out");
for(int i = 1; i <= M; i++)
{
in>>X>>Y>>K;
out<<query(X, Y, K)<<"\n";
}
in.close(); out.close();
return 0;
}