Cod sursa(job #1042991)

Utilizator Robert29FMI Tilica Robert Robert29 Data 27 noiembrie 2013 21:19:01
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.59 kb
#include<fstream>
using namespace std;
#define dim 1001
ifstream fi("struti.in");
ofstream fo("struti.out");
int l1,l2,f1,f2,nr,minim,a[dim][dim],b[dim][dim],d1[dim],d2[dim],n,m,k,i,j,x,y,c[dim][dim];
int main(){
    fi>>n>>m>>k;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            fi>>a[i][j];
    for(i=1;i<=n;++i)
        b[i][1]=c[i][1]=a[i][1];
    for(int o=1;o<=k;++o){
        fi>>x>>y;
        nr=0;
        minim=9000;
         
        for(i=1;i<=n;++i){
            d1[1]=d2[1]=l1=l2=f1=f2=1;
            for(j=2;j<=m;++j){
                 
                while(l1>=f1&&a[i][d1[l1]]>=a[i][j])
                    l1--;
                d1[++l1]=j;
                while(d1[f1]+x<=j)
                    f1++;
                 
                while(l2>=f2&&a[i][d2[l2]]<=a[i][j])
                    l2--;
                d2[++l2]=j;
                while(d2[f2]+x<=j)
                    f2++;
                 
                b[i][j]=a[i][d2[f2]];
                c[i][j]=a[i][d1[f1]];
            }
        }
         
        for(j=x;j<=m;++j){
             
            d2[1]=l2=f2=d1[1]=l1=f1=1;
            for(i=2;i<=n;++i){
                 
                while(l1>=f1&&c[d1[l1]][j]>=c[i][j])
                    l1--;
                d1[++l1]=i;
                while(d1[f1]+y<=i)
                    f1++;
                 
                while(l2>=f2&&b[d2[l2]][j]<=b[i][j])
                    l2--;
                d2[++l2]=i;
                while(d2[f2]+y<=i)
                    f2++;
                if(i>=y)
                    if(minim>b[d2[f2]][j]-c[d1[f1]][j]){
                        minim=b[d2[f2]][j]-c[d1[f1]][j];
                        nr=1;
                    }else if(minim==b[d2[f2]][j]-c[d1[f1]][j])
                        nr++;
                 
            }
        }
        if(x!=y){
            for(i=1;i<=n;++i){
                d1[1]=d2[1]=l1=l2=f1=f2=1;
                for(j=2;j<=m;++j){
                     
                    while(l1>=f1&&a[i][d1[l1]]>=a[i][j])
                        l1--;
                    d1[++l1]=j;
                    while(d1[f1]+y<=j)
                        f1++;
                     
                    while(l2>=f2&&a[i][d2[l2]]<=a[i][j])
                        l2--;
                    d2[++l2]=j;
                    while(d2[f2]+y<=j)
                        f2++;
                     
                    b[i][j]=a[i][d2[f2]];
                    c[i][j]=a[i][d1[f1]];
                }
            }
             
            for(j=y;j<=m;++j){
                 
                d2[1]=l2=f2=d1[1]=l1=f1=1;
                for(i=2;i<=n;++i){
                     
                    while(l1>=f1&&c[d1[l1]][j]>=c[i][j])
                        l1--;
                    d1[++l1]=i;
                    while(d1[f1]+x<=i)
                        f1++;
                     
                    while(l2>=f2&&b[d2[l2]][j]<=b[i][j])
                        l2--;
                    d2[++l2]=i;
                    while(d2[f2]+x<=i)
                        f2++;
                    if(i>=x)
                        if(minim>b[d2[f2]][j]-c[d1[f1]][j]){
                            minim=b[d2[f2]][j]-c[d1[f1]][j];
                            nr=1;
                        }else if(minim==b[d2[f2]][j]-c[d1[f1]][j])
                            nr++;
                         
                }
            }
        }
         
        fo<<minim<<' '<<nr<<'\n';
         
    }       
     
     
    fo.close();
    fi.close();
    return 0;
}