Cod sursa(job #832339)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 10 decembrie 2012 14:12:14
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#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;
}