Cod sursa(job #2098862)

Utilizator NeredesinI am not real Neredesin Data 3 ianuarie 2018 16:44:54
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

ifstream in("struti.in");
ofstream out("struti.out");

const int NMAX = 1000;
const int INF = 1 << 30;

int n, m, q, ans, nr;
int dx, dy;
int a[1 + NMAX][1 + NMAX];
int minn[1 + NMAX][1 + NMAX];
int maxx[1 + NMAX][1 + NMAX];

void solve() {
  deque < int > dmin;
  deque < int > dmax;

  for(int col = 1; col <= m; col++) {
    dmin.clear();
    dmax.clear();

    for(int lin = 1; lin <= n; lin++) {
      while(!dmax.empty() && a[dmax.back()][col] <= a[lin][col])
        dmax.pop_back();
      while(!dmin.empty() && a[dmin.back()][col] >= a[lin][col])
        dmin.pop_back();

      dmax.push_back(lin);
      dmin.push_back(lin);

      if(lin - dmax.front() == dx)
        dmax.pop_front();
      if(lin - dmin.front() == dx)
        dmin.pop_front();

      maxx[lin][col] = a[dmax.front()][col];
      minn[lin][col] = a[dmin.front()][col];
    }
  }

  for(int lin = dx; lin <= n; lin++) {
    dmin.clear();
    dmax.clear();

    for(int col = 1; col <= m; col++) {
      while(!dmax.empty() && maxx[lin][dmax.back()] <= maxx[lin][col])
        dmax.pop_back();
      while(!dmin.empty() && minn[lin][dmin.back()] >= minn[lin][col])
        dmin.pop_back();

      dmax.push_back(col);
      dmin.push_back(col);

      if(col - dmax.front() == dy)
        dmax.pop_front();
      if(col - dmin.front() == dy)
        dmin.pop_front();

      if(dy <= col) {
        int pretender = maxx[lin][dmax.front()] - minn[lin][dmin.front()];

        if(pretender < ans) {
          ans = pretender;
          nr = 1;
        } else if(pretender == ans) {
          nr++;
        }
      }
    }
  }
}

int main()
{
  in >> n >> m >> q;
  for(int i = 1; i <= n; i++) {
    for(int j = 1; j <= m; j++) {
      in >> a[i][j];
    }
  }

  for(int i = 1; i <= q; i++) {
    in >> dx >> dy;
    ans = INF;
    nr = 0;
    solve();

    if(dx != dy) {
      swap(dx, dy);
      solve();
    }

    out << ans << ' ' << nr << '\n';
  }

  in.close();
  out.close();
  return 0;
}