Cod sursa(job #2647690)

Utilizator DavidLDavid Lauran DavidL Data 5 septembrie 2020 19:17:38
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fi("plantatie.in");
ofstream fo("plantatie.out");

const int NMAX = 505;
const int LGMAX = 10;

int n, q, M[NMAX][NMAX];
int rmq[LGMAX][NMAX][NMAX];

void getRmq() {
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            rmq[0][i][j] = M[i][j];

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

int main()
{
    fi >> n >> q;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            fi >> M[i][j];

    getRmq();

    while (q--) {
        int lin, col, k;
        fi >> lin >> col >> k;

        int lmax = 0;
        while ((1 << (lmax + 1)) <= k)
            lmax++;

        int ans = 0;

        //cout << max(-100, rmq[lmax][lin][col + k - (1 << lmax)]);
        ans = max(rmq[lmax][lin][col], rmq[lmax][lin][col + k - (1 << lmax)]);
        ans = max(ans, max(rmq[lmax][lin + k - (1 << lmax)][col], rmq[lmax][lin + k - (1 << lmax)][col + k - (1 << lmax)]));

        fo << ans << "\n";
    }


    return 0;
}