Cod sursa(job #2975810)

Utilizator tudor_costinCostin Tudor tudor_costin Data 7 februarie 2023 17:01:08
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 6.04 kb
#include <iostream>
#include <fstream>
#include <deque>
#include <climits>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int Nmax=1005;
int a[Nmax][Nmax],minv[Nmax][Nmax],maxv[Nmax][Nmax];
deque<int> dqmin;
deque<int> dqmax;
int main()
{
    int m,n,p;
    long long sol,nr;
    fin>>m>>n>>p;
    for(int i=1; i<=m; i++)
    {
        for(int j=1; j<=n; j++)
        {
            fin>>a[i][j];
        }
    }
    for(int i=1; i<=p; i++)
    {
        int x,y;
        fin>>x>>y;
        ///1->n y
        for(int j=1; j<=m; j++)
        {
            for(int k=1; k<=n; k++)
            {
                minv[j][k]=0;
                maxv[j][k]=0;
            }
        }
        for(int j=1; j<=m; j++)
        {
            dqmin.clear();
            dqmax.clear();
            for(int k=1; k<=n; k++)
            {
                while(!dqmin.empty() && a[j][k]<a[j][dqmin.back()])
                {
                    dqmin.pop_back();
                }
                dqmin.push_back(k);
                if(dqmin.front()<=k-y)
                {
                    dqmin.pop_front();
                }
                if(k>=y)
                {
                    minv[j][k]=a[j][dqmin.front()];
                }
                while(!dqmax.empty() && a[j][k]>a[j][dqmax.back()])
                {
                    dqmax.pop_back();
                }
                dqmax.push_back(k);
                if(dqmax.front()<=k-y)
                {
                    dqmax.pop_front();
                }
                if(k>=y)
                {
                    maxv[j][k]=a[j][dqmax.front()];
                }
            }
        }
        sol=LLONG_MAX,nr=0;
        for(int j=1; j<=n-y+1; j++)
        {
            dqmin.clear();
            dqmax.clear();
            for(int k=1; k<=m; k++)
            {
                while(!dqmin.empty() && minv[k][j+y-1]<minv[dqmin.back()][j+y-1])
                {
                    dqmin.pop_back();
                }
                dqmin.push_back(k);
                if(dqmin.front()<=k-x)
                {
                    dqmin.pop_front();
                }
                while(!dqmax.empty() && maxv[k][j+y-1]>maxv[dqmax.back()][j+y-1])
                {
                    dqmax.pop_back();
                }
                dqmax.push_back(k);
                if(dqmax.front()<=k-x)
                {
                    dqmax.pop_front();
                }
                if(k>=x)
                {
                    int alt=maxv[dqmax.front()][j+y-1]-minv[dqmin.front()][j+y-1];
                    if(alt<sol)
                    {
                        sol=alt;
                        nr=1;
                    }
                    else if(alt==sol)
                    {
                        nr++;
                    }
                    ///cout<<maxv[dqmax.front()][j+y-1]<<' '<<minv[dqmin.front()][j+y-1]<<' '<<k<<' '<<j<<' '<<i<<'\n';
                }
            }
        }
        ///1->n x
        if(x!=y)
        {

            int aux=y;
            y=x;
            x=aux;
            for(int j=1; j<=m; j++)
            {
                for(int k=1; k<=n; k++)
                {
                    minv[j][k]=0;
                    maxv[j][k]=0;
                }
            }
            for(int j=1; j<=m; j++)
            {
                dqmin.clear();
                dqmax.clear();
                for(int k=1; k<=n; k++)
                {
                    while(!dqmin.empty() && a[j][k]<a[j][dqmin.back()])
                    {
                        dqmin.pop_back();
                    }
                    dqmin.push_back(k);
                    if(dqmin.front()<=k-y)
                    {
                        dqmin.pop_front();
                    }
                    if(k>=y)
                    {
                        minv[j][k]=a[j][dqmin.front()];
                    }
                    while(!dqmax.empty() && a[j][k]>a[j][dqmax.back()])
                    {
                        dqmax.pop_back();
                    }
                    dqmax.push_back(k);
                    if(dqmax.front()<=k-y)
                    {
                        dqmax.pop_front();
                    }
                    if(k>=y)
                    {
                        maxv[j][k]=a[j][dqmax.front()];
                    }
                }
            }
            for(int j=1; j<=n-y+1; j++)
            {
                dqmin.clear();
                dqmax.clear();
                for(int k=1; k<=m; k++)
                {
                    while(!dqmin.empty() && minv[k][j+y-1]<minv[dqmin.back()][j+y-1])
                    {
                        dqmin.pop_back();
                    }
                    dqmin.push_back(k);
                    if(dqmin.front()<=k-x)
                    {
                        dqmin.pop_front();
                    }
                    while(!dqmax.empty() && maxv[k][j+y-1]>maxv[dqmax.back()][j+y-1])
                    {
                        dqmax.pop_back();
                    }
                    dqmax.push_back(k);
                    if(dqmax.front()<=k-x)
                    {
                        dqmax.pop_front();
                    }
                    if(k>=x)
                    {
                        int alt=maxv[dqmax.front()][j+y-1]-minv[dqmin.front()][j+y-1];
                        if(alt<sol)
                        {
                            sol=alt;
                            nr=1;
                        }
                        else if(alt==sol)
                        {
                            nr++;
                        }
                        ///cout<<maxv[dqmax.front()][j+y-1]<<' '<<minv[dqmin.front()][j+y-1]<<' '<<k<<' '<<j<<' '<<i<<'\n';
                    }
                }
            }
        }
        fout<<sol<<' '<<nr<<'\n';
    }
    return 0;
}