Cod sursa(job #2037418)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 12 octombrie 2017 10:27:41
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <cstdio>
#include <deque>
#define N 1005
#define INF 8005

using namespace std;

int n, m, p, dx, dy, mat[N][N];
deque <int> mini, maxi;
int minim=INF, nr;

void citire()
{
    scanf("%d %d %d\n", &n, &m, &p);
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            scanf("%d ", &mat[i][j]);
}

void parcurgere_lung(int sti, int stj)
{
    for(int i=sti;i<sti+dx;i++)
        for(int j=stj;j<stj+dy;j++)
        {
            while(!mini.empty() && mini.back()>mat[i][j])
                mini.pop_back();
            mini.push_back(mat[i][j]);
            while(!maxi.empty() && maxi.back()<mat[i][j])
                maxi.pop_back();
            maxi.push_back(mat[i][j]);
        }
}

void parcurgere_latime(int sti, int stj)
{
    for(int i=sti;i<sti+dy;i++)
        for(int j=stj;j<stj+dx;j++)
        {
            while(!mini.empty() && mini.back()>mat[i][j])
                mini.pop_back();
            mini.push_back(mat[i][j]);
            while(!maxi.empty() && maxi.back()<mat[i][j])
                maxi.pop_back();
            maxi.push_back(mat[i][j]);
        }
}

void initializare()
{
    while(!maxi.empty())
        maxi.pop_back();
    while(!mini.empty())
        mini.pop_back();
}

void parcurgere()
{
    for(int i=0;i<=n-dx;i++)
        for(int j=0;j<=n-dy;j++)
        {
            parcurgere_lung(i, j);
//            printf("%d-%d=%d\n", maxi.front(), mini.front(), maxi.front()-mini.front());
            int x=maxi.front()-mini.front();
            initializare();
            if(x==minim)
                nr++;
            else
                if(x<minim)
                {
                    nr=1;
                    minim=x;
                }
        }
    if(dx!=dy)
        for(int i=0;i<=n-dy;i++)
            for(int j=0;j<=n-dx;j++)
            {
                parcurgere_latime(i, j);
//              printf("%d-%d=%d\n", maxi.front(), mini.front(), maxi.front()-mini.front());
                int x=maxi.front()-mini.front();
                initializare();
                if(x==minim)
                    nr++;
                else
                    if(x<minim)
                    {
                        nr=1;
                        minim=x;
                    }
            }
}

int main()
{
    freopen("struti.in", "r", stdin);
    freopen("struti.out", "w", stdout);

    citire();
    for(int t=0;t<p;t++)
    {
        scanf("%d %d\n", &dx, &dy);
        parcurgere();
        printf("%d %d\n", minim, nr);
    }
    return 0;
}