Cod sursa(job #1219147)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 13 august 2014 16:07:51
Problema Struti Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;

int t[1001][1001];
int mint[1001][1001];
int maxt[1001][1001];

deque<int> dqmin;
deque<int> dqmax;

int m, n, p, x, y, minh = 8000, nr;

void rez(int x, int y) {
   for(int a = 1; a <= m; ++a) {
      dqmin.clear();
      dqmax.clear();
      for(int b = 1; b <= n; ++b) {
         while(!dqmin.empty() && t[a][dqmin.back()] > t[a][b]) dqmin.pop_back();
         dqmin.push_back(b);
         if(b - dqmin.front() == x) dqmin.pop_front();
         while(!dqmax.empty() && t[a][dqmax.back()] < t[a][b]) dqmax.pop_back();
         dqmax.push_back(b);
         if(b - dqmax.front() == x) dqmax.pop_front();
         if(b >= x) mint[a][b - x + 1] = t[a][dqmin.front()], maxt[a][b - x + 1] = t[a][dqmax.front()];
      }
   }
   for(int b = 1; b <= n - x + 1; ++b) {
      dqmin.clear();
      dqmax.clear();
      for(int a = 1; a <= m; ++a) {
         while(!dqmin.empty() && mint[dqmin.back()][b] > mint[a][b]) dqmin.pop_back();
         dqmin.push_back(a);
         if(a - dqmin.front() == y) dqmin.pop_front();
         while(!dqmax.empty() && maxt[dqmax.back()][b] < maxt[a][b]) dqmax.pop_back();
         dqmax.push_back(a);
         if(b - dqmax.front() == y) dqmax.pop_front();
         if(a >= y) {
            if(maxt[dqmax.front()][b] - mint[dqmin.front()][b] < minh) {
               minh = maxt[dqmax.front()][b] - mint[dqmin.front()][b];
               nr = 1;
            }
            else if(maxt[dqmax.front()][b] - mint[dqmin.front()][b] == minh) ++nr;
         }
      }
   }
}

int main()
{
    ifstream cin("struti.in");
    ofstream cout("struti.out");

    cin >> m >> n >> p;
    for(int i = 1; i <= m; ++i)
      for(int j = 1; j <= n; ++j)
         cin >> t[i][j];

    for(int i = 1; i <= p; ++i) {
      cin >> x >> y;
      nr = 0, minh = 8000;
      rez(x, y);
      if(x != y) rez(y, x);
      cout << minh << ' ' << nr << '\n';
    }
    return 0;
}