Cod sursa(job #2120731)

Utilizator sichetpaulSichet Paul sichetpaul Data 2 februarie 2018 20:25:12
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <deque>
using namespace std;
deque <int> Max;
deque <int> Min;

ifstream f("struti.in");
ofstream g("struti.out");

int n,m,i,j,a[1001][1001],sol,nr,t;
void solve(int x,int y) {
  int i,j,jj,vmax,vmin,sol,nr;
  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();
      while (!Min.empty() && vmin<=Min.back())
        Min.pop_back();

      Max.push_back(vmax);
      Min.push_back(vmin);
      if (i>=x) {
         if (sol>Max.front()-Min.front())
            sol=Max.front()-Min.front(),nr=1;
         if (sol==Max.front()-Min.front()) ++nr;
         }
        if (Max.size()==x) Max.pop_front();
        if (Min.size()==x) Min.pop_front();
    }
    Max.clear();
    Min.clear();
  }
}
int main()
{ int dx,dy,i,j;

    f>>n>>m>>t;
    for (i=1;i<=n;++i)
    for (j=1;j<=m;++j)
       f>>a[i][j];
    for (; t; --t) {
        f>>dx>>dy;
        sol=8001;nr=0;
        solve(dx,dy);
        if (dx!=dy) solve(dy,dx);
        g<<sol<<" "<<nr<<'\n';
    }
    f.close();
    g.close();
    return 0;
}