Cod sursa(job #2417167)

Utilizator mihneacazCazacu Mihnea mihneacaz Data 29 aprilie 2019 01:56:55
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <fstream>
#include <deque>
#include <algorithm>

const int NMAX=1005;
using namespace std;

ifstream cin ("struti.in");
ofstream cout ("struti.out");

short int a[NMAX][NMAX];
short int minim1[NMAX][NMAX],maxim1[NMAX][NMAX],minim2[NMAX][NMAX],maxim2[NMAX][NMAX];
int m,n;

pair <int,int> solve(int dx,int dy)
{
    for(int i=1; i<=m; ++i)
    {
        deque <int> qmin;
        deque <int> qmax;
        for(int j=1; j<=n; ++j)
        {
            while(!qmin.empty() && a[i][qmin.back()]>=a[i][j])
                qmin.pop_back();
            qmin.push_back(j);
            if(qmin.front()<=j-dx)
                qmin.pop_front();
            minim1[i][j]=a[i][qmin.front()];
            while(!qmax.empty() && a[i][qmax.back()]<=a[i][j])
                qmax.pop_back();
            qmax.push_back(j);
            if(qmax.front()<=j-dx)
                qmax.pop_front();
            maxim1[i][j]=a[i][qmax.front()];
        }
    }
    for(int j=1; j<=n; ++j)
    {
        deque <int> qmin;
        deque <int> qmax;
        for(int i=1; i<=m; ++i)
        {
            while(!qmin.empty() && minim1[qmin.back()][j]>=minim1[i][j])
                qmin.pop_back();
            qmin.push_back(i);
            if(qmin.front()<=i-dy)
                qmin.pop_front();
            minim2[i][j]=minim1[qmin.front()][j];
            while(!qmax.empty() && maxim1[qmax.back()][j]<=maxim1[i][j])
                qmax.pop_back();
            qmax.push_back(i);
            if(qmax.front()<=i-dy)
                qmax.pop_front();
            maxim2[i][j]=maxim1[qmax.front()][j];
        }
    }
    int dif=1e6,cnt=0;
    for(int i=dy; i<=m; ++i)
        for(int j=dx; j<=n; ++j){
            if(maxim2[i][j]-minim2[i][j]<dif)
            {
                dif=maxim2[i][j]-minim2[i][j];
                cnt=1;
            }
            else
                if(maxim2[i][j]-minim2[i][j]==dif)
                    cnt++;
        }
    for(int i=1; i<=m; ++i)
        for(int j=1; j<=n; ++j)
            minim1[i][j]=maxim1[i][j]=minim2[i][j]=maxim2[i][j]=0;
    return {dif,cnt};
}
int main()
{
    int p;
    cin>>m>>n>>p;
    for(int i=1; i<=m; ++i)
        for(int j=1; j<=n; ++j)
            cin>>a[i][j];
    for(int q=1; q<=p; ++q)
    {
        int dx,dy;
        cin>>dx>>dy;
        pair <int,int> a=solve(dx,dy);
        pair <int,int> b=solve(dy,dx);
        if(dx==dy){
            cout<<a.first<<" "<<a.second<<'\n';
            continue;
        }
        if(a.first<b.first)
            cout<<a.first<<" "<<a.second<<'\n';
        else
            if(a.first==b.first)
                cout<<a.first<<" "<<a.second+b.second<<'\n';
            else
                cout<<b.first<<" "<<b.second<<'\n';

    }
    return 0;
}