Cod sursa(job #2620902)

Utilizator UtilizatorGBGeorge Bodea UtilizatorGB Data 29 mai 2020 20:50:31
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <cmath>
#include <algorithm>
#include <fstream>

using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");

int rmq[10][500][500];


int main() {
    int n, m;
    f >> n >> m;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            f >> rmq[0][i][j];

    for (int i = 1; (1 << i) <= n; i++) { // i <= log 2 n matrice
        // Calculam pe linii maximele
        for (int j = 0; j < n; j++) { // linie
            for (int k = 0; k < n; k++) {  // coloana
                if (n <= k + (1 << (i - 1)))
                    rmq[i][j][k] = rmq[i - 1][j][k]; //rmq[i][j] = min(rmq[i-1][j],rmq[n-1][n-1]);
                else
                    rmq[i][j][k] = max(rmq[i - 1][j][k], rmq[i - 1][j][k + (1 << (i - 1))]);
            }
        }

        // Extindem de la linie la patrat
        for (int j = 0; j < n; j++) // linie
            for (int k = 0; k < n; k++) {  // coloana
                if (j+(1<<i-1)<n)
                    rmq[i][j][k] = max(rmq[i][j][k], rmq[i][j +(1<<(i-1))][k]); // Luam maximul maximelor de pe linii
            }
    }
    int x, y , l;
    for (int i = 0; i < m; i++) {
        f >> x >> y >> l;
        x--;
        y--;
        int k = (int)log2(l); // cea mai mare putare a lui 2 <= lungimea intervalului meu
        int maxi_king = max(max(rmq[k][x][y],rmq[k][x][y+l-(1<<k)]),max(rmq[k][x+l-(1<<k)][y],rmq[k][x+l-(1<<k)][y+l-(1<<k)]));
        g << maxi_king << '\n';
    }

    f.close();
    g.close();
    return 0;
}