Cod sursa(job #1434579)

Utilizator greenadexIulia Harasim greenadex Data 10 mai 2015 20:54:53
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

int n, m, lg[501], rmq[9][501][501];

int max4 (int a, int b, int c, int d) {
    if (a >= b && a >= c && a >= d)
        return a;
    if (b >= a && b >= c && b >= d)
        return b;
    if (c >= a && c >= b && c >= d)
        return c;
    return d;
}

void create_lg(int n) {
    lg[1] = 0;
    for (int i = 2; i <= n; i++)
        lg[i] = lg[i / 2] + 1;
}

void create_rmq(int n) {
    for (int k = 1; (1 << k) <= n; k++)
        for (int i = 1; i + (1 << k) - 1 <= n; i++)
            for (int j = 1; j + (1 << k) - 1 <= n; j++)
                rmq[k][i][j] = max4(rmq[k - 1][i][j],
                                    rmq[k - 1][i][j + (1 << k) / 2],
                                    rmq[k - 1][i + (1 << k) / 2][j],
                                    rmq[k - 1][i + (1 << k) / 2][j + (1 << k) / 2]);

}

int main() {
    fin >> n >> m;

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

    create_lg(n);
    create_rmq(n);

    for(int a, b, c, d, l; m; m--) {
        fin >> a >> b >> l;
        c = a + l - 1;
        d = b + l - 1;
        int i = lg[l - 1];
        fout << max4(rmq[i][a][b],
                     rmq[i][a][d - (1 << i) + 1],
                     rmq[i][c - (1 << i) + 1][b],
                     rmq[i][c - (1 << i) + 1][d - (1 << i) + 1]) << '\n';

    }
    return 0;
}