Cod sursa(job #967782)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 28 iunie 2013 14:31:35
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
using namespace std;

const int MAX_N = 502;

int N, M;
int A[MAX_N][MAX_N], B[MAX_N][MAX_N][11], log[MAX_N];

int main(){
    ifstream f("plantatie.in");
    ofstream g("plantatie.out");

    f >> N >> M;
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= N; ++j)
            f >> A[i][j];

    for(int i = 2; i < MAX_N; ++i){
        int a = 1, n = 0;
        while(a < i)
            a *= 2, ++n;
        if(a != i)
            --n;
        log[i] = n;
    }
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= N; ++j)
            B[i][j][0] = A[i][j];
    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){
                B[i][j][k] = max(B[i][j][k-1], B[i+(1 << (k-1))][j][k-1]);
                B[i][j][k] = max(B[i][j][k], B[i][j+(1 << (k-1))][k-1]);
                B[i][j][k] = max(B[i][j][k], B[i+(1 << (k-1))][j+(1 << (k-1))][k-1]);
            }

    for(int q = 1, x, y, k, l, ans; q <= M; ++q){
        f >> x >> y >> k;
        l = log[k];
        ans = max(B[x][y][l], B[x+k-(1 << l)][y][l]);
        ans = max(ans, B[x][y+k-(1 << l)][l]);
        ans = max(ans, B[x+k-(1 << l)][y+k-(1 << l)][l]);

        g << ans << '\n';
    }

    f.close();
    g.close();

    return 0;
}