Cod sursa(job #2676951)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 25 noiembrie 2020 15:33:38
Problema Struti Scor 80
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <bits/stdc++.h>
	
 
	
using namespace std;
	
	
	
const string FILENAME = "struti";	
	
ifstream fin(FILENAME + ".in");
	
ofstream fout(FILENAME + ".out");
	
	
	
const int NMax = 1050;
	
	
	
struct var {
	
    int val, x, y;
	
};
	
	
	
int n, m;
	
int v[NMax][NMax];
	
	
	
pair < int, int > Solve(int a, int b) {	
	
    deque < var > mDQ[m], MDQ[m];	
	
    pair < int, int > ret = {INT_MAX, 0}; 
	
	
	
    for (int i = 0; i < n; ++i) {	
	
        for (int j = 0; j < m; ++j) {	
	
            if (!mDQ[j].empty() && mDQ[j].front().x <= i - a) {	
	
                mDQ[j].pop_front();	
	
            }	
	
            while (!mDQ[j].empty() && v[i][j] <= mDQ[j].back().val) {	
	
                mDQ[j].pop_back();	
	
            }	
	
            mDQ[j].push_back({v[i][j], i, j}); 
	
	
	
            if (!MDQ[j].empty() && MDQ[j].front().x <= i - a) {	
	
                MDQ[j].pop_front();	
	
            }	
	
            while (!MDQ[j].empty() && v[i][j] >= MDQ[j].back().val) {	
	
                MDQ[j].pop_back();	
	
            }	
	
            MDQ[j].push_back({v[i][j], i, j});	
	
        }	
	
        if (i >= a - 1) {	
	
            deque < var > mnD, mxD;	
	
            for (int j = 0; j < m; ++j) {	
	
                int mn = mDQ[j].front().val;	
	
                int mx = MDQ[j].front().val;	
	
                if (!mnD.empty() && mnD.front().y <= j - b) {	
	
                    mnD.pop_front();	
	
                }	
	
                while (!mnD.empty() && mn <= mnD.back().val) {	
	
                    mnD.pop_back();	
	
                }
	
	
	
                mnD.push_back(mDQ[j].front()); 
	
	
	
                if (!mxD.empty() && mxD.front().y <= j - b) {	
	
                    mxD.pop_front();	
	
                }	
	
                while (!mxD.empty() && mx >= mxD.back().val) {	
	
                    mxD.pop_back();	
	
                }	
	
                mxD.push_back(MDQ[j].front()); 
	
	
	
                if (j >= b - 1) {	
	
                    int dif = mxD.front().val - mnD.front().val;	
	
                    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;
	
}