Cod sursa(job #966544)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 26 iunie 2013 10:47:01
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int R[10][503][503], l2[503];

void RMQ (const int N) {

    int k, i, j, l, n;
    for (k = 1; (1 << k) <= N; ++k) {
        l = 1 << k - 1;
        n = N - (1 << k) + 1;
        for (i = 1; i <= n; ++i)
            for (j = 1; j <= n; ++j)
                R[k][i][j] = max (max (R[k - 1][i][j], R[k - 1][i][j + l]), max (R[k - 1][i + l][j], R[k - 1][i + l][j + l]));
    }

}

int QRY (const int i, const int j, const int l) {

    return max (max (R[l2[l]][i][j], R[l2[l]][i + l - (1 << l2[l])][j]), max(R[l2[l]][i][j + l - (1 << l2[l])], R[l2[l]][i + l - (1 << l2[l])][j + l - (1 << l2[l])]));

}

void citire () {

    freopen ("plantatie.in", "r", stdin);
    freopen ("plantatie.out", "w", stdout);
    int N, M, j, i, l;
    scanf ("%d%d", &N, &M);
    for (i = 1; i <= N; ++i) {
        l2 [i + 1] = l2[(i + 1) >> 1] + 1;
        for (j = 1; j <= N; ++j)
            scanf ("%d", &R[0][i][j]);
    }

    RMQ (N);

    while (M--)
        scanf ("%d%d%d", &i, &j, &l),
        printf ("%d\n", QRY (i, j, l));


}

int main() {

    citire ();

}