Cod sursa(job #1304231)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 28 decembrie 2014 19:31:16
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <cstdio>
#include <fstream>
#include <deque>
#define nmax 1005
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int sol,n,m,p,nr;
int v[nmax][nmax];
int minim[nmax][nmax],maxim[nmax][nmax];

deque <int> x;
deque <int> xmin,xmax;


void dequeminlin(int l,int b)
{int i,j,t;
t=b;
for (i=1;i<=t;i++) {
        while (!x.empty()&&v[l][i]<v[l][x.back()]) x.pop_back();
        x.push_back(i);
}

while (t<=m)
    {minim[l][t]=v[l][x.front()];
     t++;
     while (!x.empty()&&v[l][t]<v[l][x.back()]) x.pop_back();
     x.push_back(t);

     if (x.front()+b<=t) x.pop_front();
  }
x.clear();
}



void dequemaxlin(int l,int b)
{int i,j,t;
t=b;
for (i=1;i<=t;i++) {
        while (!x.empty()&&v[l][i]>v[l][x.back()]) x.pop_back();
        x.push_back(i);
}

while (t<=m)
   {maxim[l][t]=v[l][x.front()];
    t++;
    while (!x.empty()&&v[l][t]>v[l][x.back()]) x.pop_back();
    x.push_back(t);

    if (x.front()+b<=t) x.pop_front();
}
x.clear();
}


void Solve(int a,int b)
{int i,j,k;
for (i=1;i<=n;i++)
        {dequeminlin(i,b);
         dequemaxlin(i,b);
         }
for (j=b;j<=m;j++) {
        for (i=1;i<=a;i++) {
                while (!xmin.empty()&&minim[i][j]<minim[xmin.back()][j])
                            xmin.pop_back();
                xmin.push_back(i);

                while (!xmax.empty()&&maxim[i][j]>maxim[xmax.back()][j])
                            xmax.pop_back();
                xmax.push_back(i);
                    }
        k=maxim[xmax.front()][j]-minim[xmin.front()][j];
        if (k<sol) {
                sol=k;
                nr=1;
        }    else if (k==sol) nr++;

        for (i=a+1;i<=n;i++) {
                while (!xmin.empty()&&minim[i][j]<minim[xmin.back()][j])
                            xmin.pop_back();
                xmin.push_back(i);

                if (i-xmin.front()>=a) xmin.pop_front();

                while (!xmax.empty()&&maxim[i][j]>maxim[xmax.back()][j])
                            xmax.pop_back();
                xmax.push_back(i);

                if (i-xmax.front()>=a) xmax.pop_front();

                k=maxim[xmax.front()][j]-minim[xmin.front()][j];
                if (k<sol) {
                sol=k;
                nr=1;
                    }  else if (k==sol) nr++;
                }
        xmin.clear();
        xmax.clear();
        }

}


int main()
{   int i,j,a,b;
    f>>n>>m>>p;
    for (i=1;i<=n;i++) for (j=1;j<=m;j++)
                            f>>v[i][j];
    for (i=1;i<=p;i++){
            sol=1<<30;
            f>>a>>b;
            Solve(a,b);
            if (a!=b) Solve(b,a);
            g<<sol<<' '<<nr<<'\n';
    }
return 0;
}