Cod sursa(job #678465)

Utilizator cdascaluDascalu Cristian cdascalu Data 11 februarie 2012 19:39:58
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <stdio.h>
#define Nmax 1001
#define INF 0x3f3f3f3f
using namespace std;
int N,P,M,a[Nmax][Nmax];
int cnt,min;
struct matr
{
    int min,max;
}b[Nmax][Nmax];
void deque(int l,int c)
{
//    printf("%d %d\n",l,c);
    int i,j,dmin[Nmax],dmax[Nmax],x;
    int st_min,st_max,fn_min,fn_max;
    for(i=1;i<=M;++i)
    {
        st_min      = 1;
        fn_min      = 0;

        st_max      = 1;
        fn_max      = 0;

        for(j=1;j<=N;++j)
        {

            //maxim pe linie
            x = a[i][j];

            while(fn_max>=st_max && x >= a[i][ dmax[ fn_max ] ])
                --fn_max;

            dmax[++fn_max] = j;

            if(dmax[st_max] == j-c)
                ++st_max;

            if(j>=c)
                b[i][j].max = a[i][ dmax[ st_max ] ];

            //minim pe linie
            x = a[i][j];

            while(fn_min>=st_min && x <= a[i][ dmin[ fn_min ] ])
                --fn_min;

            dmin[++fn_min] = j;

            if(dmin[st_min] == j-c)
                ++st_min;

            if(j>=c)
                b[i][j].min = a[i][ dmin[ st_min ] ];

        }
    }
    for(j=c;j<=N;++j)
    {
        st_min      = 1;
        fn_min      = 0;

        st_max      = 1;
        fn_max      = 0;

        for(i=1;i<=M;++i)
        {
            //maxim
            x = b[i][j].max;

            while(fn_max>=st_max && x >= b[ dmax[ fn_max ] ][j].max)
                --fn_max;

            dmax[ ++fn_max ] = i;

            if(dmax[ st_max ] == i-l)
                ++st_max;

            //minim
            x = b[i][j].min;

            while(fn_min>=st_min && x <= b[ dmin[ fn_min] ][j].min)
                --fn_min;

            dmin[ ++fn_min ] = i;

            if(dmin[ st_min ] == i-l)
                ++st_min;

            if(i>=l)
            {
                int val = b[ dmax[st_max] ][j].max - b[ dmin[st_min] ][j].min;
                if(val <= min)
                {
                    if(val == min)
                    {
                        ++cnt;
                    }
                    else
                    {
                        min = val;
                        cnt = 1;
                    }
                }
            }
        }
    }
}
int main()
{
    FILE*f = fopen("struti.in","r");
    fscanf(f,"%d %d %d", &M, &N, &P);

    int i,j;
    for(i=1;i<=M;++i)
    for(j=1;j<=N;++j)
        fscanf(f,"%d",&a[i][j]);

    FILE*g = fopen("struti.out","w");

    int x, y;

    while(P--)
    {
        cnt         = 0;
        min         = INF;
        fscanf(f,"%d %d",&x,&y);


        deque(x,y);
        if(x!=y)
            deque(y,x);


        fprintf(g,"%d %d\n",min,cnt);
    }

    fclose(f);
    fclose(g);
    return 0;
}