Cod sursa(job #2484064)

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

using namespace std;

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

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()
{
    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<<'\n';
    }
}