Cod sursa(job #2683252)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 10 decembrie 2020 18:52:48
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.28 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 < int > minDq;
deque < int > maxDq;
/************************************************/
/// 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 FirstDeque(const int a, const int b)
{
    /// WE CREATE THE MINMAT AND MAXMAT
    for(int j = 1 ; j <= M ; ++ j)
    {
        minDq.clear();
        maxDq.clear();
        for(int i = 1 ; i <= N ; ++ i)
        {
            while(!maxDq.empty() && land[maxDq.back()][j] <= land[i][j]) maxDq.pop_back();
            while(!minDq.empty() && land[minDq.back()][j] >= land[i][j]) minDq.pop_back();
            minDq.push_back(i);
            maxDq.push_back(i);

            if(minDq.front() == i - a) minDq.pop_front();
            if(maxDq.front() == i - a) maxDq.pop_front();

            maxMat[i][j] = land[maxDq.front()][j];
            minMat[i][j] = land[minDq.front()][j];
        }
    }
}
///--------------------------------------------------------------------
void SecondDeque(const int a, const int b)
{
    /// DEQUE ON MINMAT AND MAXMAT

    for(int i = a ; i <= N; ++ i)
    {
        minDq.clear();
        maxDq.clear();
        for(int j = 1 ; j <= M ; ++ j)
        {
            while(!maxDq.empty() && maxMat[i][maxDq.back()] <= maxMat[i][j]) maxDq.pop_back();
            while(!minDq.empty() && minMat[i][minDq.back()] >= minMat[i][j]) minDq.pop_back();
            maxDq.push_back(j);
            minDq.push_back(j);

            if(maxDq.front() == j - b) maxDq.pop_front();
            if(minDq.front() == j - b) minDq.pop_front();

            if(j >= b && minDiff > (maxMat[i][maxDq.front()] - minMat[i][minDq.front()]))
            {
                minDiff = maxMat[i][maxDq.front()] - minMat[i][minDq.front()];
                ap = 1;
            }
            else if(j >= b && (maxMat[i][maxDq.front()] - minMat[i][minDq.front()]) == minDiff)
            {
                ap++;
            }
        }
    }
}
///--------------------------------------------------------------------
inline void Solution()
{
    while(P--)
    {
        int a, b;
        minDiff =21000;
        ap = 0;
        f >> a >> b;
        FirstDeque(a, b);
        SecondDeque(a, b);
        if(a != b)
        {
            FirstDeque(b, a);
            SecondDeque(b, a);
        }
        Output();
    }
}
///--------------------------------------------------------------------
void Output()
{
    g << minDiff << " " << ap << "\n";
}
///--------------------------------------------------------------------
int main()
{
    ReadInput();
    Solution();
    return 0;
}