Cod sursa(job #3149314)

Utilizator catalinmarincatalinmarin catalinmarin Data 7 septembrie 2023 11:23:07
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int mat[501][501];
int lg[501];
int p2[9];
int rmq[501][501][9];
int main(){
    int n, m;
    fin >> n >> m;
    for (int i = 2; i <= n; i++){
        lg[i] = lg[i / 2] + 1;
    }
    p2[0] = 1;
    for (int i = 1; i <= 8; i++){
        p2[i] = p2[i - 1] * 2;
    }
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= n; j++){
            fin >> mat[i][j];
            rmq[i][j][0] = mat[i][j];
        }
    }
    for (int k = 1; k <= 8; k++){
        for (int i = 1; i + p2[k] - 1 <= n; i++){
            for (int j = 1; j + p2[k] - 1 <= n; j++){
                int nrp2 = p2[k - 1];
                int t1 = rmq[i][j][k-1];
                int t2 = rmq[i + nrp2][j][k - 1];
                int t3 = rmq[i][j + nrp2][k - 1];
                int t4 = rmq[i + nrp2][j + nrp2][k - 1];
                rmq[i][j][k] = max(max(t1, t2), max(t3, t4));
            }
        }
    }
    for (int i = 1; i <= m; i++){
        int x, y, len;
        fin >> x >> y >> len;
        int log = lg[len];
        int nrp2 = p2[log];
        int t1 = rmq[x][y][log];
        int t2 = rmq[x][y + len - nrp2][log];
        int t3 = rmq[x + len - nrp2][y][log];
        int t4 = rmq[x + len - nrp2][y + len - nrp2][log];
        fout << max(max(t1, t2), max(t3, t4)) << '\n';
    }
    return 0;
}