Cod sursa(job #2447000)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 11 august 2019 14:40:26
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<fstream>
#include<algorithm>
#include<deque>
using namespace std;
ifstream cin("struti.in");
ofstream cout("struti.out");

short n,m,p,x[2];
short mat[1005][1005];

int main(){

    cin>>n>>m>>p;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>mat[i][j];

    while(p--){

        cin>>x[0]>>x[1];

        deque<short> DeqMinline[2][1005],DeqMaxline[2][1005];
        deque<pair<short,short> > DeqMinRectangle[2][1005],DeqMaxRectangle[2][1005];

        int DifMin=8005,Nr;

        for(int j=1;j<=m;j++)
            for(int i=1;i<=n;i++)
                for(int c=0;c<2;c++){

                deque<short> &dmin=DeqMinline[c][i],&dmax=DeqMaxline[c][i];
                deque<pair<short,short> > &hmin=DeqMinRectangle[c][j],&hmax=DeqMaxRectangle[c][j];

                short *a=mat[i];

                while(!dmin.empty() && a[dmin.back()]>=a[j]) dmin.pop_back();
                dmin.push_back(j);
                while(!dmax.empty() && a[dmax.back()]<=a[j]) dmax.pop_back();
                dmax.push_back(j);

                if(j>=x[c]){

                    while(!hmin.empty() && hmin.back().second>=a[dmin.front()]) hmin.pop_back();
                    hmin.push_back(make_pair(i,a[dmin.front()]));
                    while(!hmax.empty() && hmax.back().second<=a[dmax.front()]) hmax.pop_back();
                    hmax.push_back(make_pair(i,a[dmax.front()]));

                    if(i>=x[1-c]){

                        int Dif=hmax.front().second-hmin.front().second;

                        if(Dif<DifMin){

                            DifMin=Dif;
                            Nr=1;

                        }
                        else if(Dif==DifMin) ++Nr;

                    }

                    if(hmin.front().first==i-x[1-c]+1) hmin.pop_front();
                    if(hmax.front().first==i-x[1-c]+1) hmax.pop_front();

                }

                if(dmin.front()==j-x[c]+1) dmin.pop_front();
                if(dmax.front()==j-x[c]+1) dmax.pop_front();

                if(x[0]==x[1]) break;

            }

        cout<<DifMin<<' '<<Nr<<'\n';

    }

}