Cod sursa(job #2484057)

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

using namespace std;

int deq[maxim],deqM[maxim];
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)
{
     int f1,f2,l1,l2;
     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]] )
                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)
{
    int f1,f2,l1,l2;
    for (int j=b;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];
        }
     for (int i=a; i<=n ;i++ )
         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++;


    }
}
void solve(int a , int b)
{
    deqlinii(a,b);
    deqcoloane(a,b);
}
int main()
{
    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);
    }
}