Cod sursa(job #2484053)

Utilizator alexradu04Radu Alexandru alexradu04 Data 30 octombrie 2019 17:27:33
Problema Struti Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <bits/stdc++.h>
#define maxim 1003

using namespace std;

int  deq[maxim],deqM[maxim];
int f1,l1,f2,l2;
int n,p,m,DX,DY;
int ans,nr;
int mat[maxim][maxim],mmin[maxim][maxim],mmax[maxim][maxim];
int ansmin[maxim][maxim],ansmax[maxim][maxim];

void deqlinii(int a, int b)
{
    for (int i=1;i<=n; ++i )
    {    f1=f2=1;
         l1=l2=0;
        for (int j=1;j<=m;++j)
        {
            while (l1 >=f1 && mat[i][j] < mat[i][deq[l1]] )  // queue 1 de min
                l1--;
            deq[++l1]=j;

            if (j-deq[f1]  >=  b)
                f1++;

            mmin[i][j]=mat[i][deq[f1]];

            while (l2 >= f2 && mat[i][j]> mat[i][deqM[l2]])
                l2--;
            deqM[++l2]=j;
            if (j-deqM[f2]  >=  b)
               f2++;
            mmax[i][j]=mat[i][deqM[f2]];

        }

    }
}

void deqcoloane(int a,  int b)
{

    for (int j=1;j<=m;++j)
    {
        f1=f2=1;
        l1=l2=0;
        for (int i = 1; i <= n; ++i)
        {
            while (l1 >= f1 && mmin[i][j] < mmin[deq[l1]][j])
                l1--;
            deq[++l1]=i;
            if (i - deq[f1] >= a)
                f1++;
            ansmin[i][j] = mmin[deq[f1]][j];

            while (l2 >= f2 &&  mmax[i][j] > mmax[deqM[l2]][j] )
                l2--;
            deqM[++l2]=i;

            if (i-deqM[f2] >= a)
                f2++;
            ansmax[i][j]=mmax[deqM[f2]][j];
        }

    }
}

void solve(int a , int b)
{

    deqlinii(a,b);
    deqcoloane(a,b);

    for (int i=a;i<=n;i++)
        for (int j=b;j<=m;j++)
            if ( ansmax[i][j]-ansmin[i][j] < ans)
            {
                ans=ansmax[i][j]-ansmin[i][j];
                nr=1;
            }
            else if (ansmax[i][j]-ansmin[i][j] == ans)
                nr++;

}

int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d %d %d",&m,&n,&p);
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j)
            scanf("%d",&mat[i][j]);

    while (p--)
    {
        scanf("%d %d",&DX,&DY);
        ans=8001;
        nr=0;
        solve(DX,DY);
        if (DX!=DY)
            solve(DY,DX);
        printf("%d %d\n",ans,nr);
    }

}