Cod sursa(job #2313625)

Utilizator ivddabDabelea Ioana-Viviana ivddab Data 7 ianuarie 2019 11:28:44
Problema Struti Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <deque>
#define NM 1002
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int n,m,i,j,k,l,x,y,p,soll,nr,d;
int a[NM][NM],b[NM][NM],mn[NM][NM],mx[NM][NM];
deque < int > dq;
int Min(int x,int y){
  for(i=1;i<=n;i++){
     for(j=1;j<=m;j++){
        while(!dq.empty()&&a[i][j]<=a[i][dq.back()]) dq.pop_back();
        dq.push_back(j);
        if(j-y>=dq.front()) dq.pop_front();
        if(j>=y) b[i][j-y+1]=a[i][dq.front()];
     }
     dq.clear();
  }
  dq.clear();
  for(j=1;j<=m-y+1;j++){
    for(i=1;i<=n;i++){
        while(!dq.empty()&&b[i][j]<=b[dq.back()][j]) dq.pop_back();
        dq.push_back(i);
        if(i-x>=dq.front()) dq.pop_front();
        if(i>=x) mn[i-x+1][j]=b[dq.front()][j];
    }
    dq.clear();
  }
  dq.clear();
}
int Max(int x,int y){
  for(i=1;i<=n;i++){
     for(j=1;j<=m;j++){
        while(!dq.empty()&&a[i][j]>=a[i][dq.back()]) dq.pop_back();
        dq.push_back(j);
        if(j-y>=dq.front()) dq.pop_front();
        if(j>=y) b[i][j-y+1]=a[i][dq.front()];
     }
     dq.clear();
  }
  dq.clear();
  for(j=1;j<=m-y+1;j++){
    for(i=1;i<=n;i++){
        while(!dq.empty()&&b[i][j]>=b[dq.back()][j]) dq.pop_back();
        dq.push_back(i);
        if(i-x>=dq.front()) dq.pop_front();
        if(i>=x) mx[i-x+1][j]=b[dq.front()][j];
    }
    dq.clear();
  }
  dq.clear();
}
int main()
{
    f>>n>>m>>p;
    for(i=1;i<=n;i++)
     for(j=1;j<=m;j++) f>>a[i][j];
    for(k=1;k<=p;k++){
        f>>x>>y; soll=NM*NM; nr=0;
        for(l=1;l<=2;l++){
            Min(x,y);
            Max(x,y);
            for(i=1;i<=n-x+1;i++)
              for(j=1;j<=m-y+1;j++){
                d=mx[i][j]-mn[i][j];
                if(d<soll) soll=d,nr=1;
                  else
                if(d==soll) nr++;
              }
           if(x==y) l=3;
             else d=x,x=y,y=d;
        }
        g<<soll<<' '<<nr<<'\n';
    }
    return 0;
}