Cod sursa(job #2676929)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 25 noiembrie 2020 14:06:01
Problema Struti Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 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) {
    multiset < int > MSet;
    for (int i = 0; i < a; ++i) {
        for (int j = 0; j < b; ++j) {
            MSet.insert(v[i][j]);
        }
    }

    pair < int, int > ret = {*MSet.rbegin() - *MSet.begin(), 1};
    for (int i = a - 1; i < n; ++i) {
        for (int j = b; j < m; ++j) {
            for (int k = 0; k < a; ++k) {
                MSet.erase(MSet.find(v[i - k][j - b]));
                MSet.insert(v[i - k][j]);
            }
            int dif = *MSet.rbegin() - *MSet.begin();
            if (ret.first > dif) {
                ret = {dif, 1};
            } else if (ret.first == dif) {
                ++ret.second;
            }
        }
        ++i;
        if (i < n) {
            for (int k = 0; k < b; ++k) {
                MSet.erase(MSet.find(v[i - a][m - k - 1]));
                MSet.insert(v[i][m - k - 1]);
            }
            int dif = *MSet.rbegin() - *MSet.begin();
            if (ret.first > dif) {
                ret = {dif, 1};
            } else if (ret.first == dif) {
                ++ret.second;
            }

            for (int j = m - b - 1; j >= 0; --j) {
                for (int k = 0; k < a; ++k) {
                    MSet.erase(MSet.find(v[i - k][j + b]));
                    MSet.insert(v[i - k][j]);
                }
                int dif = *MSet.rbegin() - *MSet.begin();
                if (ret.first > dif) {
                    ret = {dif, 1};
                } else if (ret.first == dif) {
                    ++ret.second;
                }
            }
        }
        ++i;
        if (i < n) {
            for (int k = 0; k < b; ++k) {
                MSet.erase(MSet.find(v[i - a][k]));
                MSet.insert(v[i][k]);
            }
            int dif = *MSet.rbegin() - *MSet.begin();
            if (ret.first > dif) {
                ret = {dif, 1};
            } else if (ret.first == dif) {
                ++ret.second;
            }
        }
        --i;
    }

    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;
}