Cod sursa(job #2428053)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 3 iunie 2019 17:46:46
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <bits/stdc++.h>
#define maxim 1003

using namespace std;

ifstream f("struti.in");
ofstream g("struti.out");

deque < int > deq,deqM;
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]; // nici eu nu stiu ce fac ok

void deqlinii(int a, int b)
{
    for (int i=1;i<=n; i++ )
    {
        for (int j=1;j<=m;j++)
        {
            while (!deq.empty() && mat[i][j] < mat[i][deq.back()] )
                deq.pop_back();
            deq.push_back(j);

         if (j-deq.front()  >=  b)
             deq.pop_front();

            mmin[i][j]=mat[i][deq.front()];

            while (!deqM.empty() && mat[i][j]> mat[i][deqM.back()])
                deqM.pop_back();
            deqM.push_back(j);
            if (j-deqM.front()  >=  b)
                deqM.pop_front();
            mmax[i][j]=mat[i][deqM.front()];

        }
        deq.clear();
        deqM.clear();
    }
}

void deqcoloane(int a,  int b)
{

    for (int j=1;j<=m;j++)
    {
        for (int i = 1; i <= n; i++)
        {
            while (!deq.empty() && mmin[i][j] < mmin[deq.back()][j])
                deq.pop_back();
            deq.push_back(i);
            if (i - deq.front() >= a)
                deq.pop_front();
            ansmin[i][j] = mmin[deq.front()][j];

            while (!deqM.empty () &&  mmax[i][j] > mmax[deqM.back()][j] )
                deqM.pop_back();
            deqM.push_back(i);

            if (i-deqM.front() >= a)
                deqM.pop_front();
            ansmax[i][j]=mmax[deqM.front()][j];
        }
        deq.clear();
        deqM.clear();
    }
}

void solve(int a , int b)
{
    memset(mmin,0,sizeof(mmin));
    memset(mmax,0,sizeof(mmax));
    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()
{
    f>>n>>m>>p;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            f>>mat[i][j];

    while (p--)
    {
        f>>DX>>DY;
        ans=8001;
        nr=0;
        solve(DX,DY);
        if (DX!=DY)
            solve(DY,DX);
        g<<ans<<" "<<nr<<endl;
    }


}