Cod sursa(job #1106229)

Utilizator cosmyoPaunel Cosmin cosmyo Data 12 februarie 2014 17:39:47
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <fstream>
#include <iostream>
using namespace std;
const int N = 1005;
const int INF = 1 << 30;
int a[N][N], mn[N][N], mx[N][N], dmin[N], dmax[N], p, n, m, MAX;
long long nr; 
void solve(int dx, int dy) {
    int i, j, front = 1, back = 0, p = 1, u = 0;
    for(i = 0; i <= n; ++i)
        for(j = 0; j <= m; ++j) 
        {
            mx[i][j] = INF;
            mn[i][j] = -INF;
        }
 
    for(i = 1; i <= n; ++i) {
        front = 1; back = 0; p = 1; u = 0;
        for(int j = 0; j <= max(m, n); ++j)
        {
          dmin[j] = 0;
          dmax[j] = 0;
        }
        for(j = 1; j <= m; ++j) {
            while(front <= back && a[i][dmin[back]] >= a[i][j])
                --back;
            dmin[++back] = j;
 
            while(p <= u && a[i][dmax[u]] <= a[i][j])
                --u;
            dmax[++u] = j;
 
            if(j >= dy){
                mn[i][j - dy + 1] = a[i][dmin[front]];
                mx[i][j - dy + 1] = a[i][dmax[p]];
            }
 
            if(dmin[back] - dmin[front] + 1 == dy)
                ++front;
 
            if(dmax[u] - dmax[p] + 1 == dy)
                ++p;
        }
    }
    
    for(int j = 1; j <= m - dy + 1; ++j) {
        front  = 1; back = 0; p = 1; u = 0;
        
        for(int i = 0; i <= max(m, n); ++i)
        {
          dmin[i] = 0;
          dmax[i] = 0;
        }
        for(int i = 1; i <= n; ++i) {
            while(front <= back && mn[dmin[back]][j] >= mn[i][j])
                --back;
            dmin[++back] = i;
 
            while(p <= u && mx[dmax[u]][j] <= mx[i][j])
                --u;
            dmax[++u] = i;
            
         //   cout << "DX " << dx << " " << dy << '\n';
        //  printf("%d %d\n", mn[dmin[front]][j], mx[dmax[p]][j]);
            if(i >= dx) {
        //        cout << "location " << i << " " << j << "\n";
                if(mx[dmax[p]][j] - mn[dmin[front]][j] == MAX)
                     ++nr;
                if(mx[dmax[p]][j] - mn[dmin[front]][j] < MAX) {
       //             cout << "DA\n";
         //           cout << dmax[p] << " " << dmin[front] << '\n';
           //         cout << mx[dmax[p]][j] << " " <<  mn[dmin[front]][j] << '\n';
                    MAX = mx[dmax[p]][j] - mn[dmin[front]][j];
                    nr = 1;
                }
                 
            }
 
            if(dmin[back] - dmin[front] + 1 == dx)
                ++front;
 
            if(dmax[u] - dmax[p] + 1 == dx)
                ++p;
        }
    //  printf("\n");
    }
//    cout << '\n';
//  printf("%d\n", nr);
}
 
int main() {
  ifstream cin("struti.in");
  ofstream cout("struti.out");
  cin >> n >> m >> p;
    int i, j;
    for(i = 1; i <= n; ++i)
        for(j = 1; j <= m; ++j)
            cin >> a[i][j];
 
    for(i = 1; i <= p; ++i) {
        int dx, dy;
        cin >> dx >> dy;
        nr = 0;
        MAX = INF;
        solve(dx, dy);
  //      cout << MAX << '\n';
        if(dx != dy) 
            solve(dy, dx);
        
    //    cout << MAX << '\n';
        cout << MAX << " " << nr << '\n';
    }
    return 0;
}