Cod sursa(job #1045682)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 1 decembrie 2013 21:22:42
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 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 deq[1005];

void rezolvare(int x,int y)
{

    for(int k=1;k<=n;k++)
    {

        int li=1,lf=0;

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

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

        }


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

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

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

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

        }
    }

    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[deq[lf]][k]<=max[i][k])
                --lf;
            deq[++lf]=i;
        }

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

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

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


    for(int k=1;k<=n;k++)
    {

        int li=1,lf=0;

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

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

        }


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

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

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

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

        }
    }

    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[deq[lf]][k]>=min[i][k])
                --lf;
            deq[++lf]=i;
        }

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

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

            while(lf>=li && min[deq[lf]][k]>=min[i][k])
                --lf;
            deq[++lf]=i;
            minf[i-x+1][k]=min[deq[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++)
            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;
}