Cod sursa(job #3221126)

Utilizator Dani111Gheorghe Daniel Dani111 Data 5 aprilie 2024 23:22:21
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <bits/stdc++.h>
using namespace std;

const int MAX = 500;
int N, Q;
int rmq[50][MAX + 3][MAX + 3];
int E[MAX + 3];
int X, Y, L;

int main() {
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);

    cin >> N >> Q;
    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= N; j++) {
            cin >> rmq[0][i][j];
        }
        
    }

    for(int p = 1; (1 << p) <= N; p++) {
        for(int i = 1; i <= N; i++) {
            for(int j = 1; j <= N; j++) {
                rmq[p][i][j] = rmq[p - 1][i][j];
                int i1 = i + (1 << (p - 1));
                int j1 = j + (1 << (p - 1));    
                if(i1 <= N) {
                    rmq[p][i][j] = max(rmq[p][i][j], rmq[p - 1][i1][j]);
                }
                if(j1 <= N) {
                    rmq[p][i][j] = max(rmq[p][i][j], rmq[p - 1][i][j1]);
                }
                
                if(i1 <= N && j1 <= N) {
                    rmq[p][i][j] = max(rmq[p][i][j], rmq[p - 1][i1][j1]);
                }
            }
        }
    }

    // for(int i = 0; (1 << i) <= N; i++) {
    //     for(int j = 1; j <= N; j++) {
    //         for(int l = 1; l <= N; l++) {
    //             cout << rmq[i][j][l] << ' ';
    //         }
    //         cout << '\n';
    //     }
    // }

    for(int i = 2; i <= N; i++) {
        E[i] = 1 + E[i / 2]; 
    }

    for(int i = 1; i <= Q; i++) {
        cin >> X >> Y >> L;

        int e = E[L];
        int len = (1 << e);

        int X1 = X + L - len;
        int Y1 = Y + L - len;

        cout << max(max(rmq[e][X][Y], rmq[e][X][Y1]), max(rmq[e][X1][Y], rmq[e][X1][Y1])) << '\n';
    }
}
/*
    (Formatul la exemplu e aiurea)
    8 3
    7 8 0 0 0 0 5 5
    0 0 0 0 0 0 5 5
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 1 2 3 4
    0 0 0 0 5 6 7 8
    0 0 0 0 9 10 11 12
    1 1 1 1 14 15 16 17
    1 1 8
    4 5 3
    2 2 6

*/