Cod sursa(job #3134204)

Utilizator Andrei20035Rusu Andrei Andrei20035 Data 28 mai 2023 18:36:14
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <vector>
using namespace std;

string file = "plantatie";
ifstream cin(file + ".in");
ofstream cout(file + ".out");

const int N = 500;
int dp[9][N + 1][N + 1], np;

vector<int> powers;
inline void calculatePowers(int n) {
    powers.push_back(1);
    for (int i = 2; i <= n; i = i << 1) {
        powers.push_back(i);
    }
    np = powers.size();
}

inline int binarySearch(int x) {
    int left = 1, right = np - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (powers[mid] <= x) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return right;
}

inline void rmq(int n) {
    for (int k = 1; k < np; k++) {
        for (int i = powers[k]; i <= n; i++) {
            for (int j = powers[k]; j <= n; j++) {
                dp[k][i][j] = max(max(dp[k - 1][i][j], dp[k - 1][i - powers[k - 1]][j]), max(dp[k - 1][i][j - powers[k - 1]], dp[k - 1][i - powers[k - 1]][j - powers[k - 1]]));
            }
        }
    }
}

inline int query(int i, int j, int k) {
    int e = binarySearch(k), x = powers[e];
    return max(max(dp[e][i + x - 1][j + x - 1], dp[e][i + k - 1][j + x - 1]), max(dp[e][i + x - 1][j + k - 1], dp[e][i + k - 1][j + k - 1]));
}

int main() {
    int n, m, x, y, z;
    cin >> n >> m;
    calculatePowers(n);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> dp[0][i][j];
        }
    }
    rmq(n);
    for (int i = 1; i <= m; i++) {
        cin >> x >> y >> z;
        cout << query(x, y, z) << '\n';
    }
}