Cod sursa(job #3229212)

Utilizator anamaria29sSuditu Ana-Maria anamaria29s Data 14 mai 2024 15:17:11
Problema Plantatie Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>

using namespace std;

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

void preprocessMaxRight(vector<vector<int>>& productivity, vector<vector<int>>& max_right, int N, int K) {
    for (int i = 1; i <= N; ++i) {
        deque<int> deq;
        for (int j = 1; j <= N; ++j) {
            while (!deq.empty() && deq.front() < j - K + 1) {
                deq.pop_front();
            }
            while (!deq.empty() && productivity[i][deq.back()] <= productivity[i][j]) {
                deq.pop_back();
            }
            deq.push_back(j);
            if (j >= K) {
                max_right[i][j - K + 1] = productivity[i][deq.front()];
            }
        }
    }
}

int main() {
    int N, M;
    f >> N >> M;
    vector<vector<int>> productivity(N + 1, vector<int>(N + 1));

    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= N; ++j) {
            f >> productivity[i][j];
        }
    }

    vector<vector<int>> max_right(N + 1, vector<int>(N + 1, 0));


    for (int q = 0; q < M; ++q) {
        int i, j, k;
        f >> i >> j >> k;
        preprocessMaxRight(productivity, max_right, N, k);
        int max_productivity = 0;
        for (int x = i; x <= i + k - 1; ++x) {
            max_productivity = max(max_productivity, max_right[x][j]);
        }

        g << max_productivity << endl;
    }

    return 0;
}