Cod sursa(job #478552)

Utilizator freak93Adrian Budau freak93 Data 19 august 2010 09:26:46
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include<fstream>

using namespace std;

const char iname[]="struti.in";
const char oname[]="struti.out";
const int maxn=1005;

ifstream f(iname);
ofstream g(oname);

int a[maxn][maxn],mint[maxn][maxn],maxt[maxn][maxn],dx,dy,i,j,n,m,k,dmin[maxn],dmax[maxn],pmin,qmin,pmax,qmax,rez,many;

void calc(int dx,int dy)
{
    for(i=1;i<=n;++i)
        {
            pmin=pmax=1;
            qmin=qmax=0;
            for(j=1;j<=m;++j)
            {
                while(qmin>=pmin&&a[i][dmin[qmin]]>=a[i][j])
                    --qmin;
                dmin[++qmin]=j;
                while(dmin[pmin]<=j-dy)
                    ++pmin;
                mint[i][j]=a[i][dmin[pmin]];

                while(qmax>=pmax&&a[i][dmax[qmax]]<=a[i][j])
                    --qmax;
                dmax[++qmax]=j;
                while(dmax[pmax]<=j-dy)
                    ++pmax;
                maxt[i][j]=a[i][dmax[pmax]];
            }
        }

    for(j=dy;j<=m;++j)
        {
            pmin=pmax=1;
            qmin=qmax=0;
            for(i=1;i<=n;++i)
            {
                while(qmin>=pmin&&mint[dmin[qmin]][j]>=mint[i][j])
                    --qmin;
                dmin[++qmin]=i;
                while(dmin[pmin]<=i-dx)
                    ++pmin;

                while(qmax>=pmax&&maxt[dmax[qmax]][j]<=maxt[i][j])
                    --qmax;
                dmax[++qmax]=i;
                while(dmax[pmax]<=i-dx)
                    ++pmax;
                if(i<dx)
                    continue;
                if(maxt[dmax[pmax]][j]-mint[dmin[pmin]][j]<rez)
                    rez=maxt[dmax[pmax]][j]-mint[dmin[pmin]][j],many=1;
                else
                    if(maxt[dmax[pmax]][j]-mint[dmin[pmin]][j]==rez)
                        ++many;
            }
        }
}

int main()
{
    f>>n>>m>>k;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            f>>a[i][j];
    while(k--)
    {
        f>>dx>>dy;
        rez=8005;many=0;
        calc(dx,dy);
        if(dx-dy)
            calc(dy,dx);
        g<<rez<<" "<<many<<"\n";
    }
}