Cod sursa(job #2120911)

Utilizator sichetpaulSichet Paul sichetpaul Data 3 februarie 2018 08:09:47
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <fstream>
#include <deque>
using namespace std;
int a[1001][1001],vmax[1001][1001],vmin[1001][1001];
deque <int> Max;
deque <int> Min;
int main()
{ int n,m,i,j,sol,nr,p,q,x,y,sum;
    ifstream f("struti.in");
    ofstream g("struti.out");
    f>>n>>m>>p;
    for (i=1;i<=n;++i)
    for (j=1;j<=m;++j)
       f>>a[i][j];
    for (q=1;q<=p;++q) {
        f>>x>>y;
        sol=8001,nr=0;
        for (i=1;i<=n;++i) {
        for (j=1;j<=m;++j)  {
           while (!Max.empty() && a[i][j]>=a[i][Max.back()])
               Max.pop_back();
            Max.push_back(j);
           while (!Min.empty() && a[i][j]<=a[i][Min.back()])
              Min.pop_back();
           Min.push_back(j);

           if (j>=y) vmax[i][j-y+1]=a[i][Max.front()],vmin[i][j-y+1]=a[i][Min.front()];
           if (Max.front()==j-y+1) Max.pop_front();
           if (Min.front()==j-y+1) Min.pop_front();
           }
           Max.clear();Min.clear();
        }

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


        if (x!=y) {
            swap(x,y);
            for (i=1;i<=n;++i) {
        for (j=1;j<=m;++j)  {
           while (!Max.empty() && a[i][j]>=a[i][Max.back()])
               Max.pop_back();
            Max.push_back(j);
           while (!Min.empty() && a[i][j]<=a[i][Min.back()])
              Min.pop_back();
           Min.push_back(j);

           if (j>=y) vmax[i][j-y+1]=a[i][Max.front()],vmin[i][j-y+1]=a[i][Min.front()];
           if (Max.front()==j-y+1) Max.pop_front();
           if (Min.front()==j-y+1) Min.pop_front();
           }
           Max.clear();Min.clear();
        }

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

        }
         g<<sol<<" "<<nr<<'\n';
    }
    return 0;
}