Cod sursa(job #2055458)

Utilizator dianamariaDiana Cataros dianamaria Data 3 noiembrie 2017 11:19:41
Problema Struti Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <fstream>
#include <algorithm>

using namespace std;
ifstream in ("struti.in");
ofstream out ("struti.out");

const int N=1002;
int n,m;
int a[N][N],st1[N],st2[N],dr2[N],dr1[N],d1[N][N],d2[N][N],dmin[N],dmax[N],deq1[N],deq2[N];

int struti(int dx,int dy,int &mini,int &ap)
{
    mini=2000000000, ap=0;
    int i,j,stmin,drmin,stmax,drmax;
    for (i=1;i<=m;i++)
        st1[i]=st2[i]=1, dr1[i]=dr2[i]=0;

    for (i=1;i<=n;i++)
    {

        for (j=1;j<=m;j++)
        {
            while (st1[j]<=dr1[j] && a[d1[j][dr1[j]]][j]>=a[i][j])
                dr1[j]--;
            dr1[j]++;
            d1[j][dr1[j]]=i;
            if (st1[j]<=dr1[j] && d1[j][st1[j]]==i-dx)
                st1[j]++;
            if (i>=dx)
                dmin[j]=a[d1[j][st1[j]]][j];
        }

        for (j=1;j<=m;j++)
        {
            while (st2[j]<=dr2[j] && a[d2[j][dr2[j]]][j]<=a[i][j])
                dr2[j]--;
            dr2[j]++;
            d2[j][dr2[j]]=i;
            if (st2[j]<=dr2[j] && d2[j][st2[j]]==i-dx)
                st2[j]++;

            if (i>=dx)
                dmax[j]=a[d2[j][st2[j]]][j];
        }

        if (i>=dx)
        {
            stmin=stmax=1;
            drmin=drmax=0;
            int k;
            for (k=1;k<=m;k++)
            {
                while (stmin<=drmin && dmin[deq1[drmin]]>=dmin[k])
                    drmin--;
                drmin++;
                deq1[drmin]=k;
                while (stmin<=drmin && deq1[stmin]==k-dy)
                    stmin++;

                while (stmax<=drmax && dmax[deq2[drmax]]<=dmax[k])
                    drmax--;
                drmax++;
                deq2[drmax]=k;
                while (stmax<=drmax && deq2[stmax]==k-dy)
                    stmax++;

                if (k>=dy && stmax<=drmax && stmin<=drmin)
                {
                    if (mini>abs(dmax[deq2[stmax]]-dmin[deq1[stmin]]))
                        mini=abs(dmax[deq2[stmax]]-dmin[deq1[stmin]]), ap=1;
                    else
                        if (mini==abs(dmax[deq2[stmax]]-dmin[deq1[stmin]]))
                            ap++;
                }
            }
        }
    }
}
int main()
{
    int i,j,dx,dy,q,mini1,mini2,ap1,ap2;
    in>>n>>m>>q;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            in>>a[i][j];

    for (i=1;i<=q;i++)
    {
        in>>dx>>dy;
        ap1=ap2=0;
        if (dx==dy)
        {
            struti(dx,dy,mini1,ap1);
            out<<mini1<<" "<<ap1;
        }
        else
        {
            struti(dx,dy,mini1,ap1);
            struti(dy,dx,mini2,ap2);
            if (mini1>mini2)
                out<<mini2<<" "<<ap2<<"\n";
            else
                if (mini1==mini2)
                    out<<mini1<<" "<<ap1+ap2<<"\n";
                else
                    out<<mini1<<" "<<ap1<<"\n";
        }
    }
    return 0;
}