Cod sursa(job #2676931)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 25 noiembrie 2020 14:37:39
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <bits/stdc++.h>
	
using namespace std;
	
const string FILENAME = "struti";	
ifstream fin(FILENAME + ".in");
ofstream fout(FILENAME + ".out");
	
const int NMax = 1050;

int n, m;
int v[NMax][NMax];

pair < int, int > Solve(int a, int b) {
    deque < int > mDQ[NMax], MDQ[NMax];
    pair < int, int > ret = {INT_MAX, 0};

    for (int i = 0; i < n; ++i) {
        deque < int > mnD, mxD;
        for (int j = 0; j < m; ++j) {
            while (!mDQ[j].empty() && mDQ[j].front() <= i - a) {
                mDQ[j].pop_front();
            }
            while (!mDQ[j].empty() && v[i][j] <= v[mDQ[j].back()][j]) {
                mDQ[j].pop_back();
            }
            mDQ[j].push_back(i);

            while (!MDQ[j].empty() && MDQ[j].front() <= i - a) {
                MDQ[j].pop_front();
            }
            while (!MDQ[j].empty() && v[i][j] >= v[MDQ[j].back()][j]) {
                MDQ[j].pop_back();
            }
            MDQ[j].push_back(i);

            int mn = v[mDQ[j].front()][j];
            int mx = v[MDQ[j].front()][j];
            while (!mnD.empty() && mnD.front() <= j - b) {
                mnD.pop_front();
            }
            while (!mnD.empty() && mn <= v[mDQ[mnD.back()].front()][mnD.back()]) {
                mnD.pop_back();
            }
            mnD.push_back(j);

            while (!mxD.empty() && mxD.front() <= j - b) {
                mxD.pop_front();
            }
            while (!mxD.empty() && mx >= v[MDQ[mxD.back()].front()][mxD.back()]) {
                mxD.pop_back();
            }
            mxD.push_back(j);

            if (i >= a - 1 && j >= b - 1) {
                int dif = v[MDQ[mxD.front()].front()][mxD.front()] - v[mDQ[mnD.front()].front()][mnD.front()];
                if (ret.first > dif) {
                    ret = {dif, 1};
                } else if (ret.first == dif) {
                    ++ret.second;
                }
            }
        }
    }
    return ret;
}

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

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

    while (q--) {
        int a, b; fin >> a >> b;

        pair < int, int > ord = Solve(a, b);      
        if (a != b) {
            pair < int, int > tmp = Solve(b, a);
            if (tmp.first < ord.first) {
                ord = tmp;
            } else if (tmp.first == ord.first) {
                ord.second += tmp.second;
            }
        }  
        fout << ord.first << " " << ord.second << "\n";
    }
    return 0;
}