Cod sursa(job #1563166)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 5 ianuarie 2016 18:41:25
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.03 kb
#include <cstdio>
#include <cstdlib>
#define MAXN 1000
#define INF 1000000000
int mat[MAXN][MAXN],poz[2][MAXN],de[2][MAXN][MAXN];
//0  max
//1  min
int main(){
    FILE*fi,*fout;
    int i,j,n,m,bmin,bmax,emax,emin,l,c,q,min,con;
    fi=fopen("struti.in" ,"r");
    fout=fopen("struti.out" ,"w");
    fscanf(fi,"%d%d%d" ,&n,&m,&q);
    for(i=0;i<n;i++)
      for(j=0;j<m;j++)
         fscanf(fi,"%d" ,&mat[i][j]);
    while(q>0){
        q--;
        fscanf(fi,"%d%d" ,&l,&c);
        for(i=0;i<n;i++){
            poz[0][0]=poz[1][0]=-1;
            bmin=bmax=0;
            emin=emax=-1;
            for(j=0;j<m;j++){
                if(j-poz[0][bmax]+1>c)
                    bmax++;
                if(j-poz[1][bmin]+1>c)
                    bmin++;
                while(emax>=bmax&&mat[i][poz[0][emax]]<=mat[i][j])
                    emax--;
                while(emin>=bmin&&mat[i][poz[1][emin]]>=mat[i][j])
                    emin--;
                poz[0][++emax]=j;
                poz[1][++emin]=j;
                if(j>=c-1){
                   de[0][i][j-c+1]=mat[i][poz[0][bmax]];
                   de[1][i][j-c+1]=mat[i][poz[1][bmin]];
                }
            }
        }
        min=INF;
        for(i=0;i<=m-c;i++){
            poz[0][0]=poz[1][0]=-1;
            emax=emin=-1;
            bmax=bmin=0;
            for(j=0;j<n;j++){
                if(j-poz[0][bmax]+1>l)
                    bmax++;
                if(j-poz[1][bmin]+1>l)
                    bmin++;
                while(emax>=bmax&&de[0][poz[0][emax]][i]<=de[0][j][i])
                    emax--;
                while(emin>=bmin&&de[1][poz[1][emin]][i]>=de[1][j][i])
                    emin--;
                poz[0][++emax]=j;
                poz[1][++emin]=j;
                if(j>=l-1){
                    if(de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i]<min){
                        min=de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i];
                        con=1;
                    }
                    else
                        if(de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i]==min)
                           con++;
                }
            }
        }
        if(l!=c){
        int aux=l;
        l=c;
        c=aux;
        for(i=0;i<n;i++){
            poz[0][0]=poz[1][0]=-1;
            bmin=bmax=0;
            emin=emax=-1;
            for(j=0;j<m;j++){
                if(j-poz[0][bmax]+1>c)
                    bmax++;
                if(j-poz[1][bmin]+1>c)
                    bmin++;
                while(emax>=bmax&&mat[i][poz[0][emax]]<=mat[i][j])
                    emax--;
                while(emin>=bmin&&mat[i][poz[1][emin]]>=mat[i][j])
                    emin--;
                poz[0][++emax]=j;
                poz[1][++emin]=j;
                if(j>=c-1){
                   de[0][i][j-c+1]=mat[i][poz[0][bmax]];
                   de[1][i][j-c+1]=mat[i][poz[1][bmin]];
                }
            }
        }
        for(i=0;i<=m-c;i++){
            poz[0][0]=poz[1][0]=-1;
            emax=emin=-1;
            bmax=bmin=0;
            for(j=0;j<n;j++){
                if(j-poz[0][bmax]+1>l)
                    bmax++;
                if(j-poz[1][bmin]+1>l)
                    bmin++;
                while(emax>=bmax&&de[0][poz[0][emax]][i]<=de[0][j][i])
                    emax--;
                while(emin>=bmin&&de[1][poz[1][emin]][i]>=de[1][j][i])
                    emin--;
                poz[0][++emax]=j;
                poz[1][++emin]=j;
                if(j>=l-1)
                    if(de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i]<min){
                        min=de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i];
                        con=1;
                    }
                    else
                        if(de[0][poz[0][bmax]][i]-de[1][poz[1][bmin]][i]==min)
                           con++;
            }
        }
        }
        fprintf(fout,"%d %d\n" ,min,con);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}