Cod sursa(job #1396081)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 22 martie 2015 02:13:46
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.61 kb
#include<cstdio>
#define INF 2000000000
int n,m,t,a,b,p1,p2,u1,u2,i,j,nr,vmin,d1[1020],d2[1020],v[1020][1020],x[1020][1020],y[1020][1020];
FILE *f,*g;
int main(){
    f=fopen("struti.in","r");
    g=fopen("struti.out","w");
    fscanf(f,"%d%d%d",&n,&m,&t);
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            fscanf(f,"%d",&v[i][j]);
        }
    }
    while(t--){
        fscanf(f,"%d%d",&a,&b);
        vmin=INF;
        nr=0;
        for(i=1;i<=n;i++){
            p1=p2=u1=u2=d1[1]=d2[1]=1;
            for(j=2;j<=m;j++){
                while( p1<=u1 && v[i][ d1[u1] ] > v[i][j] )
                    u1--;
                d1[++u1]=j;
                if(j-d1[p1]==b)
                    p1++;
                if(j>=b)
                    x[i][j]=v[i][ d1[p1] ];
                while( p2<=u2 && v[i][ d2[u2] ] < v[i][j] )
                    u2--;
                d2[++u2]=j;
                if(j-d2[p2]==b)
                    p2++;
                if(j>=b)
                    y[i][j]=v[i][ d2[p2] ];
            }
        }
        for(j=b;j<=m;j++){
            p1=p2=u1=u2=d1[1]=d2[1]=1;
            for(i=2;i<=n;i++){
                while( p1<=u1 && x[i][j] < x[ d1[u1] ][j] )
                    u1--;
                d1[++u1]=i;
                if(i-d1[p1]==a)
                    p1++;
                while( p2<=u2 && y[i][j] > y[ d2[u2] ][j]  )
                    u2--;
                d2[++u2]=i;
                if(i-d2[p2]==a)
                    p2++;
                if(i>=a){
                    if( y[ d2[p2] ][j] - x[ d1[p1] ][j] < vmin ){
                        vmin=y[ d2[p2] ][j] - x[ d1[p1] ][j];
                        nr=1;
                    }
                    else if( y[ d2[p2] ][j] - x[ d1[p1] ][j] == vmin )
                        nr++;
                }
            }
        }
        if(a!=b){
            int aux=a;
            a=b;
            b=aux;
            for(i=1;i<=n;i++){
                p1=p2=u1=u2=d1[1]=d2[1]=1;
                for(j=2;j<=m;j++){
                    while( p1<=u1 && v[i][ d1[u1] ] > v[i][j] )
                        u1--;
                    d1[++u1]=j;
                    if(j-d1[p1]==b)
                        p1++;
                    if(j>=b)
                        x[i][j]=v[i][ d1[p1] ];
                    while( p2<=u2 && v[i][ d2[u2] ] < v[i][j] )
                        u2--;
                    d2[++u2]=j;
                    if(j-d2[p2]==b)
                        p2++;
                    if(j>=b)
                        y[i][j]=v[i][ d2[p2] ];
                }
            }
            for(j=b;j<=m;j++){
                p1=p2=u1=u2=d1[1]=d2[1]=1;
                for(i=2;i<=n;i++){
                    while( p1<=u1 && x[i][j] < x[ d1[u1] ][j] )
                        u1--;
                    d1[++u1]=i;
                    if(i-d1[p1]==a)
                        p1++;
                    while( p2<=u2 && y[i][j] > y[ d2[u2] ][j]  )
                        u2--;
                    d2[++u2]=i;
                    if(i-d2[p2]==a)
                        p2++;
                    if(i>=a){
                        if( y[ d2[p2] ][j] - x[ d1[p1] ][j] < vmin ){
                            vmin=y[ d2[p2] ][j] - x[ d1[p1] ][j];
                            nr=1;
                        }
                        else if( y[ d2[p2] ][j] - x[ d1[p1] ][j] == vmin )
                            nr++;
                    }
                }
            }
        }
        fprintf(g,"%d %d\n",vmin,nr);
    }






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