Cod sursa(job #1322038)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 19 ianuarie 2015 19:01:16
Problema Plantatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
using namespace std;
ifstream in ("plantatie.in");
ofstream out ("plantatie.out");

const int kNMax = 550, kLgMax = 14;
int n, Q, dp[kNMax][kNMax][kLgMax], lg[kNMax];

void CitireMatrice() {
    int i, j;
    in >> n >> Q;
    for (i = 1; i <= n; ++i)
        for (j = 1; j <= n; ++j)
            in >> dp[i][j][0];
}

void RMQ() {
    int i, j, k, q;
    for (i = 2; i <= n; ++i)
        lg[i] = lg[i / 2] + 1;
    for (k = 1; k <= lg[n]; ++k){
        q = 1 << (k-1);
        for (i = 1; i <= n; ++i)
            for (j = 1; j <= n; ++j)
                dp[i][j][k] = max (dp[i][j][k-1], max (dp[i+q][j][k-1], max (dp[i][j+q][k-1], dp[i+q][j+q][k-1])));
    }
}

void QSolve() {
    int i, x, y, l, llog, q, sol;
    for (i = 1; i <= Q; ++i) {
        in >> x >> y >> l;
        llog = lg[l];
        q = (1 << llog);
        sol = max (dp[x][y][llog], max (dp[x+l-q][y][llog], max (dp[x][y+l-q][llog], dp[x+l-q][y+l-q][llog])));
        out << sol << '\n';
    }
}

int main() {
    CitireMatrice();
    RMQ();
    QSolve();
    in.close();
    out.close();
    return 0;
}