Cod sursa(job #970619)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 7 iulie 2013 14:41:23
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in ("plantatie.in");
ofstream out ("plantatie.out");

const int MAXN = 510;

int N;
int A[MAXN][MAXN], Log[MAXN];
int RMQ[9][MAXN][MAXN];

inline int max (const int &A, const int &B, const int &C, const int &D)
{
    int X = max (A, B);
    int Y = max (C, D);

    return max (X, Y);
}

void Build_Log ()
{
    int i;

    for (i = 2; i < MAXN; i ++)
        Log[i] = Log[i / 2] + 1;
}

void Build_RMQ ()
{
    int i, j, k, a, b, c, d;

    for (i = 1; i <= N; i ++)
        for (j = 1; j <= N; j ++)
            RMQ[0][i][j] = A[i][j];

    for (k = 1; k <= Log[N]; k ++)
        for (i = 1; i <= N; i ++)
            for (j = 1; j <= N; j ++){
                a = RMQ[k - 1][i][j];
                b = RMQ[k - 1][i + (1 << (k - 1))][j];
                c = RMQ[k - 1][i][j + (1 << (k - 1))];
                d = RMQ[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))];

                RMQ[k][i][j] = max (a, b, c, d);
            }
}

inline int Solve (int i, int j, int k)
{
    int log = Log[k];

    return max (RMQ[log][i][j], RMQ[log][i + k - (1 << log)][j], RMQ[log][i][j + k - (1 << log)], RMQ[log][i + k - (1 << log)][j + k - (1 << log)]);
}

int main()
{
    int Q, i, j, k;

    in >> N >> Q;
    for (i = 1; i <= N; i ++)
        for (j = 1; j <= N; j ++)
            in >> A[i][j];

    Build_Log ();
    Build_RMQ ();

    while (Q --){
        in >> i >> j >> k;
        out << Solve (i, j, k) << "\n";
    }

    return 0;
}