Cod sursa(job #269537)

Utilizator RobybrasovRobert Hangu Robybrasov Data 2 martie 2009 23:28:45
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <cstdio>
#define inf 0x3f3f3f3f
#include <deque>
#define N 1001

using namespace std;

int m,n,p,i,j,dx,dy,kont,minim;
int A[N][N],Max[N][N],Min[N][N];
deque<int> DQ;

void matrici(int x, int y)
{
    int i,j;
    //Maxim
    for (i=1; i<=n; i++, DQ.clear())
            for (j=1; j<=m; j++)
            {
                while (!DQ.empty() && A[i][j]>=A[i][DQ.back()]) DQ.pop_back();
                DQ.push_back(j);
                if (DQ.front()<j-y+1) DQ.pop_front();
                if (j>=y) Max[i][j-y+1]=A[i][DQ.front()];
            }

        for (j=1; j<=m-y+1; j++, DQ.clear())
            for (i=1; i<=n; i++)
            {
                while (!DQ.empty() && Max[i][j]>=Max[DQ.back()][j]) DQ.pop_back();
                DQ.push_back(i);
                if (DQ.front()<i-x+1) DQ.pop_front();
                if (i>=x) Max[i-x+1][j]=Max[DQ.front()][j];
            }
        //Minim
        for (i=1; i<=n; i++, DQ.clear())
            for (j=1; j<=m; j++)
            {
                while (!DQ.empty() && A[i][j]<=A[i][DQ.back()]) DQ.pop_back();
                DQ.push_back(j);
                if (DQ.front()<j-y+1) DQ.pop_front();
                if (j>=y) Min[i][j-y+1]=A[i][DQ.front()];
            }

        for (j=1; j<=m-y+1; j++, DQ.clear())
            for (i=1; i<=n; i++)
            {
                while (!DQ.empty() && Min[i][j]<=Min[DQ.back()][j]) DQ.pop_back();
                DQ.push_back(i);
                if (DQ.front()<i-x+1) DQ.pop_front();
                if (i>=x) Min[i-x+1][j]=Min[DQ.front()][j];
            }
}

void calcule(int x, int y)
{
    for (i=1; i<=n-x+1; i++)
            for (j=1; j<=m-y+1; j++)
                if (Max[i][j]-Min[i][j]<minim)
                {
                    minim=Max[i][j]-Min[i][j];
                    kont=1;
                }
                else
                    if (Max[i][j]-Min[i][j]==minim) kont++;
}

int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	scanf("%d%d%d\n",&n,&m,&p);
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++) scanf("%d",&A[i][j]);
    while (p--)
    {
        scanf("%d%d\n",&dx,&dy);
        matrici(dx,dy);
        minim=inf;
        calcule(dx,dy);
        if (dx!=dy)
        {
            matrici(dy,dx);
            calcule(dy,dx);
        }
        printf("%d %d\n",minim,kont);
    }

    return 0;
}