Cod sursa(job #3210684)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 7 martie 2024 09:06:22
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
#include <deque>
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
struct sol
{
    int x,nr;
};
sol p1,p2;
int n,m,dif,nrq,x,y,i,j,q;
int v[1001][1001],minx[1001][1001],maxx[1001][1001],aux[1001][1001];
deque <int> deq;
bool comp (int a,int b,int ok)
{
    if (ok==1)
    {
        if (a<=b)
            return 1;
        else
            return 0;
    }
    else
    {
        if (a>=b)
            return 1;
        else
            return 0;
    }
}
void fct (bool val,int x,int y)
{
    for (int i=1; i<=n; i++)
    {
        deq.clear ();
        for (int j=1; j<=m; j++)
        {
            while (!deq.empty ()&&comp (v[i][j],v[i][deq.back ()],val))
                deq.pop_back ();
            deq.push_back (j);
            if (j>=y)
            {
                aux[i][j]=v[i][deq.front ()];
                if (j-deq.front ()+1==y)
                    deq.pop_front ();
            }
        }
    }
    for (int j=y; j<=m; j++)
    {
        deq.clear ();
        for (int i=1; i<=n; i++)
        {
            while (!deq.empty ()&&comp (aux[i][j],aux[deq.back ()][j],val))
                deq.pop_back ();
            deq.push_back (i);
            if (i>=x)
            {
                if (val==1)
                    minx[i][j]=aux[deq.front ()][j];
                else
                    maxx[i][j]=aux[deq.front ()][j];
                if (i-deq.front ()+1==x)
                    deq.pop_front ();
            }
        }
    }
}
sol solve (int x,int y)
{
    fct (1,x,y);
    fct (0,x,y);
    sol ans= {16000,0};
    for (int i=x; i<=n; i++)
    {
        for (int j=y; j<=m; j++)
        {
            dif=maxx[i][j]-minx[i][j];
            if (dif<ans.x)
            {
                ans.x=dif;
                ans.nr=1;
            }
            else if (dif==ans.x)
                ans.nr++;
        }
    }
    return ans;
}
int main()
{
    fin>>n>>m>>nrq;
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
            fin>>v[i][j];
    }
    for (q=1; q<=nrq; q++)
    {
        fin>>x>>y;
        p1=solve (x,y);
        p2=solve (y,x);
        if (x==y)
            fout<<p1.x<<" "<<p1.nr;
        else if (p1.x<p2.x)
            fout<<p1.x<<" "<<p1.nr;
        else if (p2.x<p1.x)
            fout<<p2.x<<" "<<p2.nr;
        else
            fout<<p1.x<<" "<<p1.nr+p2.nr;
        fout<<"\n";
    }
    return 0;
}