Cod sursa(job #1433982)

Utilizator greenadexIulia Harasim greenadex Data 10 mai 2015 11:30:47
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <iostream>
#include <algorithm>

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 && c >= 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;
}