Cod sursa(job #2258557)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 11 octombrie 2018 17:37:22
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.27 kb
#include <fstream>
#include <cstring>
#include <climits>
#include <deque>

using namespace std;

ifstream fin("struti.in");
ofstream fout("struti.out");

int M, N, P, minDif, minDifCount;
int matrix[1005][1005];
int minLine[1005][1005];
int maxLine[1005][1005];
int minMatrix[1005][1005];
int maxMatrix[1005][1005];

void Solve(int lin, int col)
{
    memset(minLine, 0, sizeof(minLine));
    memset(maxLine, 0, sizeof(maxLine));
    memset(minMatrix, 0, sizeof(minMatrix));
    memset(maxMatrix, 0, sizeof(maxMatrix));

    ///deque pentru min-ul fiecarei linii
    for(int i = 1; i <= M; i++)
    {
        deque <int> deq;
        for(int j = 1; j <= N; j++)
        {
            while(!deq.empty() && matrix[i][deq.back()] >= matrix[i][j])
                deq.pop_back();
            deq.push_back(j);

            if(deq.back() - deq.front() >= col)
                deq.pop_front();

            if(j >= col)
                minLine[i][j] = matrix[i][deq.front()];
        }
    }

    ///deque pentru max-ul fiecarei linii
    for(int i = 1; i <= M; i++)
    {
        deque <int> deq;
        for(int j = 1; j <= N; j++)
        {
            while(!deq.empty() && matrix[i][deq.back()] <= matrix[i][j])
                deq.pop_back();
            deq.push_back(j);

            if(deq.back() - deq.front() >= col)
                deq.pop_front();

            if(j >= col)
                maxLine[i][j] = matrix[i][deq.front()];
        }
    }

    ///deque pentru min-ul fiecarei matrici
    for(int j = col; j <= N; j++)
    {
        deque <int> deq;
        for(int i = 1; i <= M; i++)
        {
            while(!deq.empty() && minLine[deq.back()][j] >= minLine[i][j])
                deq.pop_back();
            deq.push_back(i);

            if(deq.back() - deq.front() >= lin)
                deq.pop_front();

            if(i >= lin)
                minMatrix[i][j] = minLine[deq.front()][j];
        }
    }

    ///deque pentru max-ul fiecarei matrici
    for(int j = col; j <= N; j++)
    {
        deque <int> deq;
        for(int i = 1; i <= M; i++)
        {
            while(!deq.empty() && maxLine[deq.back()][j] <= maxLine[i][j])
                deq.pop_back();
            deq.push_back(i);

            if(deq.back() - deq.front() >= lin)
                deq.pop_front();

            if(i >= lin)
                maxMatrix[i][j] = maxLine[deq.front()][j];
        }
    }

    for(int i = lin; i <= M; i++)
        for(int j = col; j <= N; j++)
            if(maxMatrix[i][j] - minMatrix[i][j] == minDif)
                minDifCount++;
            else if(maxMatrix[i][j] - minMatrix[i][j] < minDif)
            {
                minDif = maxMatrix[i][j] - minMatrix[i][j];
                minDifCount = 1;
            }
}

void Read()
{
    fin >> M >> N >> P;

    for(int i = 1; i <= M; i++)
        for(int j = 1; j <= N; j++)
            fin >> matrix[i][j];

    int dx, dy;
    for(int i = 1; i <= P; i++)
    {
        minDif = INT_MAX;
        minDifCount = 0;

        fin >> dx >> dy;

        Solve(dx, dy);
        if(dx != dy)
            Solve(dy, dx);

        fout << minDif << ' ' << minDifCount << '\n';
    }
}

int main()
{
    Read();

    return 0;
}