Cod sursa(job #2446991)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 11 august 2019 14:28:32
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 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];
        int DifMin=8005,Nr;

        for(int j=1;j<=m;j++){

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

                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],&hmax=DeqMaxRectangle[c];

                    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';

    }

}