Cod sursa(job #2134993)

Utilizator LittleWhoFeraru Mihail LittleWho Data 18 februarie 2018 15:09:21
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
/*

#include <bits/stdc++.h>

using namespace std;

int main() {
    freopen("carici.in", "r", stdin);

    //freopen(".in", "r", stdin);
    //freopen(".out", "w", stdout);

    return 0;
}

 */

#include <bits/stdc++.h>

using namespace std;

#define NMAX 501
#define pow2(x) (1 << (x))

int n, m;
int lg2[NMAX];
int D[10][NMAX][NMAX];

int main() {
    freopen("carici.in", "r", stdin);

    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> D[0][i][j];
        }
    }

    lg2[0] = 1;
    for (int i = 2; i <= n; i++) {
        lg2[i] = lg2[i / 2] + 1;
    }

    for (int k = 1; k <= lg2[n]; k++) {
        for (int i = 1; i <= n - pow2(k - 1); i++) {
            for (int j = 1; j <= n - pow2(k - 1); j++) {
                D[k][i][j] = max(
                        max(D[k - 1][i][j], D[k - 1][i][j + pow2(k - 1)]),
                        max(D[k - 1][i + pow2(k - 1)][j], D[k -1][i + pow2(k - 1)][j + pow2(k - 1)])
                );
            }
        }
    }

    while (m--) {
        int i, j, k;
        scanf("%d%d%d", &i, &j, &k);

        int p = lg2[k];
        int sol = max(
                max(D[p][i][j], D[p][i][j + k - pow2(p)]),
                max(D[p][i + k - pow2(p)][j], D[p][i + k - pow2(p)][j + k - pow2(p)])
        );

        cout << sol << "\n";
    }

    return 0;
}