Cod sursa(job #2120797)

Utilizator sichetpaulSichet Paul sichetpaul Data 2 februarie 2018 21:33:15
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <fstream>
#include <deque>
using namespace std;
deque <int> Max;
deque <int> Min;
deque <int> lmin;
deque <int> lmax;
ifstream f("struti.in");
ofstream g("struti.out");

int n,m,i,j,a[1001][1001],sol,nr,t,x,y;
int jj,vmax,vmin;
int main()
{ int dx,dy,i,j,t;

    f>>n>>m>>t;
    for (i=1;i<=n;++i)
    for (j=1;j<=m;++j)
       f>>a[i][j];
    for (; t; --t) {
        f>>x>>y;
        sol=8001;nr=0;

        for (jj=1;jj<=m-y+1;++jj) {
    for (i=1;i<=n;++i) {
        vmax=0,vmin=8001;
    for (j=jj;j<=jj+y-1;++j) {
        vmax=max(vmax,a[i][j]);
        vmin=min(vmin,a[i][j]);
    }
      while (!Max.empty() && vmax>=Max.back()) {
        Max.pop_back();
        lmax.pop_back();
      }
      while (!Min.empty() && vmin<=Min.back()) {
        Min.pop_back();
        lmin.pop_back();
      }
      Max.push_back(vmax),lmax.push_back(i);
      Min.push_back(vmin),lmin.push_back(i);
      if (i>=x) {
         if (sol>Max.front()-Min.front())
            sol=Max.front()-Min.front(),nr=1;
         else if (sol==Max.front()-Min.front())
                ++nr;
      }
        if (lmax.front()==i-x+1) Max.pop_front(),lmax.pop_front();
        if (lmin.front()==i-x+1) Min.pop_front(),lmin.pop_front();
    }
    Max.clear();lmax.clear();
    Min.clear();lmin.clear();
  }

        if (x!=y) {
            swap(x,y);
        for (jj=1;jj<=m-y+1;++jj) {
    for (i=1;i<=n;++i) {
        vmax=0,vmin=8001;
    for (j=jj;j<=jj+y-1;++j) {
        vmax=max(vmax,a[i][j]);
        vmin=min(vmin,a[i][j]);
    }
      while (!Max.empty() && vmax>=Max.back()) {
        Max.pop_back();
        lmax.pop_back();
      }
      while (!Min.empty() && vmin<=Min.back()) {
        Min.pop_back();
        lmin.pop_back();
      }

      Max.push_back(vmax),lmax.push_back(i);
      Min.push_back(vmin),lmin.push_back(i);
      if (i>=x) {
         if (sol>Max.front()-Min.front())
            sol=Max.front()-Min.front(),nr=1;
         else if (sol==Max.front()-Min.front()) ++nr;
         }
        if (lmax.front()==i-x+1) Max.pop_front(),lmax.pop_front();
        if (lmin.front()==i-x+1) Min.pop_front(),lmin.pop_front();
    }
    Max.clear();lmax.clear();
    Min.clear();lmin.clear();
  }
        }
        g<<sol<<" "<<nr<<"\n";
    }
    f.close();
    g.close();
    return 0;
}