Cod sursa(job #2898409)

Utilizator Theodor17Pirnog Theodor Ioan Theodor17 Data 6 mai 2022 17:43:09
Problema Plantatie Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>

using namespace std;

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

const int NMAX = 5e2;
int rmq[11][11][NMAX + 1][NMAX + 1], lg2[NMAX + 1], n, q;

int max4(int a, int b, int c, int d){
    return max(a, max(b, max(c, d)));
}

int ans(int x1, int y1, int x2, int y2){

    int nrlin = x2 - x1 + 1;
    int nrcol = y2 - y1 + 1;

    int ei = lg2[nrlin];
    int ej = lg2[nrcol];

    int pi = (1 << ei);
    int pj = (1 << ej);

    return max4(rmq[ei][ej][x1 + pi - 1][y1 + pj - 1], rmq[ei][ej][x1 + pi - 1][y2], rmq[ei][ej][x2][y1 + pj - 1], rmq[ei][ej][x2][y2]);

}

int main(){

    cin >> n >> q;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){

            cin >> rmq[0][0][i][j];

        }
    }

    lg2[1] = 0;
    for(short i = 2; i <= n; i++)
        lg2[i] = 1 + lg2[i >> 1];

    // RMQ
    for(int f = 1; f <= lg2[n]; f++){
        for(int i = 1; i <= n; i++){
            for(int j = (1 << f); j <= n; j++){

                int t = (1 << (f - 1));
                rmq[0][f][i][j] = max(rmq[0][f - 1][i][j - t], rmq[0][f - 1][i][j]);

            }
        }
    }

    for(int e = 1; e <= lg2[n]; e++){
        for(int f = 0; f <= lg2[n]; f++){
            for(int i = (1 << e); i <= n; i++){
                for(int j = (1 << f); j <= n; j++){

                    int t = (1 << (e - 1));
                    rmq[e][f][i][j] = max(rmq[e - 1][f][i - t][j], rmq[e - 1][f][i][j]);

                }
            }
        }
    }

    int lin = 0, col = 0, lat = 0;
    for(int i = 1; i <= q; i++){

        cin >> lin >> col >> lat;
        cout << ans(lin, col, lin + lat - 1, col + lat - 1) << "\n";

    }


    return 0;
}