Cod sursa(job #3231857)

Utilizator BogdancxTrifan Bogdan Bogdancx Data 27 mai 2024 21:47:14
Problema Plantatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

inline int max(const vector<int> &v) {
    return *std::max(v.begin(), v.end());
}

class RMQ2D {
public:
    RMQ2D() = delete;
    explicit RMQ2D(const vector<vector<int>> &v) : rmq2d(20, vector<vector<int>>(v.size(), vector<int>(v.size()))) {
        int n = v.size() - 1;

        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                rmq2d[0][i][j] = v[i][j];
            }
        }

        for(int p = 1, lat = 2; lat <= n; p++, lat <<= 1) {
            for(int i = 1; i <= n - lat + 1; i++) {
                for(int j = 1; j <= n - lat + 1; j++) {
                    int x = i + (lat >> 1);
                    int y = j + (lat >> 1);

                    rmq2d[p][i][j] = max({
                                    rmq2d[p-1][i][j], rmq2d[p-1][x][j],
                                    rmq2d[p-1][i][y], rmq2d[p-1][x][y]
                                });
                }
            }
        }

        E.resize(n + 1, 0);

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

    int query(int x, int y, int k) {
        int e = E[k];

        return max({
            rmq2d[e][x][y], rmq2d[e][x][y - (1<<e) + k],
            rmq2d[e][x - (1<<e) + k][y], rmq2d[e][x -(1<<e) +k][y - (1<<e) + k]
        });
    }
private:
    vector<vector<vector<int>>> rmq2d;
    vector<int> E;
};

#define qwes
const string file = "plantatie";

int main() {
#ifdef qwe
    ifstream fin("test.in");
    ofstream fout("output.out");
#else
    ifstream fin(file + ".in");
    ofstream fout(file + ".out");
#endif

    int n, q;
    fin >> n >> q;
    vector<vector<int>> matrix(n+1, vector<int>(n+1, 0));

    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            fin >> matrix[i][j];
        }
    }
    RMQ2D rmq2D{matrix};
    for(int i = 0; i < q; i++) {
        int a, b, c;
        fin >> a >> b >> c;
        fout << rmq2D.query(a, b, c) << '\n';
    }

    return 0;
}