Cod sursa(job #349578)

Utilizator DraStiKDragos Oprica DraStiK Data 20 septembrie 2009 11:43:23
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <stdio.h>

#define DIM 1005
#define INF 8005

int a[DIM][DIM],min[DIM][DIM],max[DIM][DIM];
int dq_min[DIM][2],dq_max[DIM][2];
int n,m,q,nrt,nrm,st1,dr1,st2,dr2;

void read ()
{
    int i,j;

    scanf ("%d%d%d",&n,&m,&q);
    for (i=1; i<=n; ++i)
        for (j=1; j<=m; ++j)
            scanf ("%d",&a[i][j]);
}

void init (int tip)
{
    int i,j;

    for (i=1; i<=n; ++i)
        for (j=1; j<=m; ++j)
            min[i][j]=max[i][j]=a[i][j];
    if (!tip)
    {
        nrt=INF;
        nrm=0;
    }
}

void solve (int x,int y)
{
    int i,j,mini,maxi;

    for (j=1; j<=m; ++j)
    {
		st1=st2=1;
        dr1=dr2=0;
        for (i=1; i<=n; ++i)
        {
            for ( ; st1<=dr1 && min[i][j]<=dq_min[dr1][0]; --dr1);
            dq_min[++dr1][0]=min[i][j];
            dq_min[dr1][1]=i;
            for ( ; st2<=dr2 && max[i][j]>=dq_max[dr2][0]; --dr2);
            dq_max[++dr2][0]=max[i][j];
			dq_max[dr2][1]=i;
			if (dq_min[st1][1]==i-y)
                ++st1;
            if (dq_max[st2][1]==i-y)
				++st2;
			min[i][j]=dq_min[st1][0];
			max[i][j]=dq_max[st2][0];

        }
    }
    for (i=y; i<=n; ++i)
    {
        st1=st2=1;
        dr1=dr2=0;
		for (j=1; j<=m; ++j)
        {
            for ( ; st1<=dr1 && min[i][j]<=dq_min[dr1][0]; --dr1);
            dq_min[++dr1][0]=min[i][j];
			dq_min[dr1][1]=j;
			for ( ; st2<=dr2 && max[i][j]>=dq_max[dr2][0]; --dr2);
			dq_max[++dr2][0]=max[i][j];
			dq_max[dr2][1]=j;
			if (dq_min[st1][1]==j-x)
				++st1;
			if (dq_max[st2][1]==j-x)
				++st2;
			mini=dq_min[st1][0];
			maxi=dq_max[st2][0];
			if (j>=x && (maxi-mini)<nrt)
			{
				nrt=maxi-mini;
				nrm=1;
			}
			else if (j>=x && maxi-mini==nrt)
				++nrm;
		}
    }
}

void query ()
{
    int i,x,y;

    for (i=1; i<=q; ++i)
    {
        scanf ("%d%d",&x,&y);
        init (0);
        solve (x,y);
        if (x!=y)
        {
            init (1);
            solve (y,x);
        }
        printf ("%d %d\n",nrt,nrm);
    }
}

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

    read ();
    query ();

    return 0;
}