Cod sursa(job #3232317)

Utilizator matei8787Matei Dobrea matei8787 Data 29 mai 2024 21:39:55
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

#define qwes
const string file = "plantatie";

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

class RMQ {
public:
    RMQ() = delete;
    explicit RMQ(const vector<vector<int>> &v) : rmq(vector<vector<vector<int>>>(v.size(), vector<vector<int>>(v.size(), vector<int>(15, 0)))) {
        int n = v.size();
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                rmq[i][j][0] = v[i][j];
            }
        }

        for(int p = 1; (1 << p) <= n; p++) {
            for(int i = 0; i + (1 << p) <= n; i++) {
                for(int j = 0; j + (1 << p) <= n; j++) {
                    rmq[i][j][p] = max({
                                               rmq[i][j][p-1],
                                               rmq[i + (1 << (p - 1))][j][p-1],
                                               rmq[i][j + (1 << (p - 1))][p-1],
                                               rmq[i + (1 << (p - 1))][j + (1 << (p - 1))][p-1]
                                       });
                }
            }
        }

        E.assign(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];
        int len = (1 << e);

        int x2 = x + k - len;
        int y2 = y + k - len;

        return max({
                           rmq[x][y][e],
                           rmq[x2][y][e],
                           rmq[x][y2][e],
                           rmq[x2][y2][e]
                   });
    }

private:
    vector<vector<vector<int>>> rmq;
    vector<int> E;
};

int main() {
    int n, q;
    fin >> n >> q;

    vector<vector<int>> v(n, vector<int>(n));
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            fin >> v[i][j];
        }
    }

    RMQ rmq{v};

    for(int i = 0; i < q; i++) {
        int a, b, c;
        fin >> a >> b >> c;
        fout << rmq.query(a - 1, b - 1, c) << '\n';
    }

    return 0;
}