Cod sursa(job #206132)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 4 septembrie 2008 21:32:00
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.17 kb
#include<stdio.h>

FILE *fin=fopen("struti.in","r"),
    *fout=fopen("struti.out","w");

int N,M,a[1005][1005],min[1005][1005],max[1005][1005],maxf[1005][1005],minf[1005][1005],P;
int dif,nr;
int dq[1005];

void rezolvare(int x,int y){

//matrice max linii
    for(int k=1;k<=N;k++){

        int li=1,lf=0;

        for(int i=1;i<y;i++){

            while(lf>=li && a[k][dq[lf]]<=a[k][i])
                --lf;
            dq[++lf]=i;

        }


        for(int i=y;i<=M;i++){

            if(dq[li] < i-y+1)
                ++li;

            while(lf>=li && a[k][dq[lf]]<=a[k][i])
                --lf;

            dq[++lf]=i;
            max[k][i-y+1]=a[k][dq[li]];

        }
    }
//pe coloane

    for(int k=1;k<=M-y+1;k++){

        int li=1,lf=0;
        for(int i=1;i<x;i++){

            while(lf>=li && max[dq[lf]][k]<=max[i][k])
                --lf;
            dq[++lf]=i;
        }

        for(int i=x;i<=N;i++){

            if(dq[li]<i-x+1)
                ++li;

            while(lf>=li && max[dq[lf]][k]<=max[i][k])
                --lf;
            dq[++lf]=i;
            maxf[i-x+1][k]=max[dq[li]][k];
        }
    }



//matricea minima
    for(int k=1;k<=N;k++){

        int li=1,lf=0;

        for(int i=1;i<y;i++){

            while(lf>=li && a[k][dq[lf]]>=a[k][i])
                --lf;
            dq[++lf]=i;

        }


        for(int i=y;i<=M;i++){

            if(dq[li] < i-y+1)
                ++li;

            while(lf>=li && a[k][dq[lf]]>=a[k][i])
                --lf;

            dq[++lf]=i;
            min[k][i-y+1]=a[k][dq[li]];

        }
    }
//pe coloane

    for(int k=1;k<=M-y+1;k++){

        int li=1,lf=0;
        for(int i=1;i<x;i++){

            while(lf>=li && min[dq[lf]][k]>=min[i][k])
                --lf;
            dq[++lf]=i;
        }

        for(int i=x;i<=N;i++){

            if(dq[li]<i-x+1)
                ++li;

            while(lf>=li && min[dq[lf]][k]>=min[i][k])
                --lf;
            dq[++lf]=i;
            minf[i-x+1][k]=min[dq[li]][k];
        }
    }

    int NN=N-x+1,MM=M-y+1;

/*
    for(int i=1;i<=NN;i++){
        for(int j=1;j<=MM;j++)
            fprintf(fout,"%d ",max[i][j]);
        fprintf(fout,"\n");
    }

    fprintf(fout,"\n");
    for(int i=1;i<=NN;i++){
        for(int j=1;j<=MM;j++)
            fprintf(fout,"%d ",maxf[i][j]);
        fprintf(fout,"%\n");
    }
*/


    for(int i=1;i<=NN;i++)
        for(int j=1;j<=MM;j++)
            if(maxf[i][j]-minf[i][j]<dif){
                dif=maxf[i][j]-minf[i][j];
                nr=1;
            }
            else
                if(maxf[i][j]-minf[i][j]==dif)
                    ++nr;

}

int main(){

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

    for(int k=1;k<=P;k++){
        int i,j;
        fscanf(fin,"%d %d",&i,&j);
        dif=80010;
        rezolvare(i,j);
        if(i!=j)
            rezolvare(j,i);
        fprintf(fout,"%d %d\n",dif,nr);
    }

    fclose(fin);
    fclose(fout);
    return 0;
}