Cod sursa(job #1208871)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 16 iulie 2014 18:27:50
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.86 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 main()
{
    ifstream cin("struti.in");
    ofstream cout("struti.out");
    int m, n, p, x, y;
    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;
      int nr = 0, minh = 8000;
      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 a = 1; a <= m; ++a) {
         for(int b = 1; b <= n - x + 1; ++b)
            cout << mint[a][b] << ' ';
         cout << '\n';
      }
      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;
                  //cout << minh << ' ' << b << ' ' << dqmax.front() << ' ' << dqmin.front() << '\n';
               }
               else if(maxt[dqmax.front()][b] - mint[dqmin.front()][b] == minh) ++nr;//, cout << nr << ' ' << b << ' ' << dqmax.front() << ' ' << dqmin.front() << '\n';;
            }
         }
      }
      if(x != 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() == y) dqmin.pop_front();
               while(!dqmax.empty() && t[a][dqmax.back()] < t[a][b]) dqmax.pop_back();
               dqmax.push_back(b);
               if(b - dqmax.front() == y) dqmax.pop_front();
               if(b >= y) mint[a][b - y + 1] = t[a][dqmin.front()], maxt[a][b - y + 1] = t[a][dqmax.front()];
            }
         }
         for(int b = 1; b <= n - y + 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() == x) dqmin.pop_front();
               while(!dqmax.empty() && maxt[dqmax.back()][b] < maxt[a][b]) dqmax.pop_back();
               dqmax.push_back(a);
               if(b - dqmax.front() == x) dqmax.pop_front();
               if(a >= x) {
                  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;
               }
            }
         }
      }
      cout << minh << ' ' << nr << '\n';
    }
    return 0;
}