Cod sursa(job #1083530)

Utilizator leontinLeontin leontin Data 16 ianuarie 2014 02:30:32
Problema Struti Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 3.56 kb
#include<fstream>
using namespace std;
#define nmaxxx 1001
ifstream fi("struti.in");
ofstream fo("struti.out");
int l1,l2,f1,f2,solll,minnn,a[nmaxxx][nmaxxx],b[nmaxxx][nmaxxx],d1[nmaxxx],d2[nmaxxx],n,m,k,i,j,x,y,c[nmaxxx][nmaxxx];
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;
        solll=1;
        minnn=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(minnn>b[d2[f2]][j]-c[d1[f1]][j])
                    {
                        minnn=b[d2[f2]][j]-c[d1[f1]][j];
                        solll=1;
                    }
                    else if(minnn==b[d2[f2]][j]-c[d1[f1]][j])
                        solll++;

            }
        }
        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(minnn>b[d2[f2]][j]-c[d1[f1]][j])
                        {
                            minnn=b[d2[f2]][j]-c[d1[f1]][j];
                            solll=1;
                        }
                        else if(minnn==b[d2[f2]][j]-c[d1[f1]][j])
                            solll++;

                }
            }
        }

        fo<<minnn<<' '<<solll<<'\n';

    }


    fo.close();
    fi.close();
    return 0;
}