Cod sursa(job #2683219)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 10 decembrie 2020 17:59:49
Problema Struti Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.34 kb
#include <bits/stdc++.h>
#define NMAX 1005
using namespace std;

/************************************************/
/// INPUT / OUTPUT
ifstream f("struti.in");
ofstream g("struti.out");
/************************************************/
/// GLOBAL DECLARATIONS

int N, M, P, land[NMAX][NMAX], ap, minDiff, minMat[NMAX][NMAX], maxMat[NMAX][NMAX];

deque < pair < int, int > > minDq;
deque < pair < int, int > > maxDq;
vector < int > differences;
/************************************************/
/// FUNCTIONS

void ReadInput();
void Solution();
void Output();
/************************************************/
///--------------------------------------------------------------------
inline void ReadInput()
{
    f >> N >> M >> P;
    for(int i = 1 ; i <= N ; ++ i)
        for(int j = 1 ; j <= M ; ++ j)
            f >> land[i][j];
}
///--------------------------------------------------------------------
void GetAnswer(const int a, const int b)
{
    minDq.clear();
    maxDq.clear();
    differences.clear();
    for(int j = 1 ; j <= M ; ++ j)
    {
        minDq.clear();
        maxDq.clear();
        for(int i = 1 ; i <= a; ++i)
       {
            while(!minDq.empty() && minDq.back().first >= land[i][j]) minDq.pop_back();
            minDq.push_back({land[i][j], i});
            ///----------------------------------------------------------------------------
           while(!maxDq.empty() && maxDq.back().first <= land[i][j]) maxDq.pop_back();
            maxDq.push_back({land[i][j], i});
        }
        minMat[1][j] = minDq.front().first;
        maxMat[1][j] = maxDq.front().first;
        for(int i = a + 1 ; i <= N; ++ i)
        {
            while(!minDq.empty() && minDq.back().first >= land[i][j]) minDq.pop_back();
            minDq.push_back({land[i][j], i});
            if(minDq.front().second <= i - a) minDq.pop_front();
            minMat[i - a + 1][j] = minDq.front().first;
            ///------------------------------------------------------------------------------
            while(!maxDq.empty() && maxDq.back().first <= land[i][j]) maxDq.pop_back();
            maxDq.push_back({land[i][j], i});
            if(maxDq.front().second <= i - a) maxDq.pop_front();
            maxMat[i - a + 1][j] = maxDq.front().first;
        }
     }
    maxDq.clear();
    minDq.clear();

    for(int i = 1 ; i <= N - a + 1; ++ i)
    {
        maxDq.clear();
        minDq.clear();
        for(int j = 1 ; j <= b ; ++ j)
        {
            while(!minDq.empty() && minDq.back().first >= minMat[i][j]) minDq.pop_back();
            minDq.push_back({minMat[i][j], j});
            ///----------------------------------------------------------------------------
            while(!maxDq.empty() && maxDq.back().first <= maxMat[i][j]) maxDq.pop_back();
            maxDq.push_back({maxMat[i][j], j});
        }
        differences.push_back(maxDq.front().first - minDq.front().first);
        minDiff = min(minDiff, maxDq.front().first - minDq.front().first);
        for(int j = b + 1; j <= M; ++ j)
        {
            while(!minDq.empty() && minDq.back().first >= minMat[i][j]) minDq.pop_back();
            minDq.push_back({minMat[i][j], j});
            if(minDq.front().second <= j - b ) minDq.pop_front();
            ///-----------------------------------------------------------------------
            while(!maxDq.empty() && maxDq.back().first <= maxMat[i][j]) maxDq.pop_back();
            maxDq.push_back({maxMat[i][j], j});
            if(maxDq.front().second <= j - b ) maxDq.pop_front();
            minDiff = min(minDiff, maxDq.front().first - minDq.front().first);
            differences.push_back(maxDq.front().first - minDq.front().first);
        }
    }
    for(auto it: differences)
        if(it == minDiff) ap++;
}
///--------------------------------------------------------------------
inline void Solution()
{
    while(P--)
    {
        int a, b;
        minDiff = 10000;
        ap = 0;
        f >> a >> b;
        GetAnswer(a, b);
        if(a != b) GetAnswer(b, a);
        Output();
    }
}
///--------------------------------------------------------------------
void Output()
{
    g << minDiff << " " << ap << "\n";
}
///--------------------------------------------------------------------
int main()
{
    ReadInput();
    Solution();
    return 0;
}