Cod sursa(job #3210240)

Utilizator Anul2024Anul2024 Anul2024 Data 5 martie 2024 17:11:20
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <fstream>
#include <deque>
using namespace std;
ifstream fin ("struti.in");
ofstream fout ("struti.out");
deque <int> q;
pair <int,int> r1,r2;
int p,t,i,j,a,b,n,m;
int v[1001][1001],maxim[1001][1001],minim[1001][1001],lin[1001][1001];
bool cmp (int x,int y,int ok)
{
    if (ok==1)
    {
        if (x>=y)
            return 1;
        else
            return 0;
    }
    else
    {
        if (x<=y)
            return 1;
        else
            return 0;
    }
}
void calc (bool ok,int a,int b)
{
    for (int i=1; i<=n; i++)
    {
        q.clear ();
        for (int j=1; j<=m; j++)
        {
            int x=v[i][j];
            while (!q.empty ()&&cmp (x,v[i][q.back()],ok))
                q.pop_back ();
            q.push_back (j);
            if (j>=b)
            {
                lin[i][j]=v[i][q.front ()];
                if (j-q.front ()+1==b)
                    q.pop_front ();
            }
        }
    }
    for (int j=b; j<=m; j++)
    {
        q.clear ();
        for (int i=1; i<=n; i++)
        {
            int x=lin[i][j];
            while (!q.empty ()&&cmp (x,lin[q.back ()][j],ok))
                q.pop_back ();
            q.push_back (i);
            if (i>=a)
            {
                if (ok==1)
                    maxim[i][j]=lin[q.front ()][j];
                else
                    minim[i][j]=lin[q.front ()][j];
                if (i-q.front ()+1==a)
                    q.pop_front ();
            }
        }
    }
}
pair <int,int> f (int a,int b)
{
    calc (1,a,b);
    calc (0,a,b);
    int sol=16001,nr=0;
    for (int i=a; i<=n; i++)
    {
        for (int j=b; j<=m; j++)
        {
            if (maxim[i][j]-minim[i][j]<sol)
            {
                sol=maxim[i][j]-minim[i][j];
                nr=1;
            }
            else if (maxim[i][j]-minim[i][j]==sol)
                nr++;
        }
    }
    return make_pair (sol,nr);
}
int main()
{
    fin>>n>>m>>p;
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
            fin>>v[i][j];
    }
    for (t=1; t<=p; t++)
    {
        fin>>a>>b;
        r1=f (a,b);
        r2=f (b,a);
        if (a==b)
            fout<<r1.first<<" "<<r1.second<<"\n";
        else
        {
            if (r1.first<r2.first)
                fout<<r1.first<<" "<<r1.second<<"\n";
            else if (r2.first<r1.first)
                fout<<r2.first<<" "<<r2.second<<"\n";
            else
                fout<<r1.first<<" "<<r1.second+r2.second<<"\n";
        }
    }
    return 0;
}