Cod sursa(job #1074607)

Utilizator cdascaluDascalu Cristian cdascalu Data 7 ianuarie 2014 19:35:55
Problema Struti Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.7 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;
}