Cod sursa(job #1991911)

Utilizator DjokValeriu Motroi Djok Data 18 iunie 2017 17:38:57
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9 + 69 * 69;
const int N = 1005;

int i, j, n, m, p, x, y, deq1[N], deq2[N], cnt, rs;
int a[N][N], mn[N][N], mx[N][N];

void solve(int dx, int dy) {
  for(i = 1; i <= n; ++i) {
    int st1 = 1, dr1 = 0, st2 = 1, dr2 = 0;
    for(j = 1; j <= m; ++j) {
      while(st1 <= dr1 && a[i][deq1[dr1]] >= a[i][j]) --dr1;
      while(st2 <= dr2 && a[i][deq2[dr2]] <= a[i][j]) --dr2;
      deq1[++dr1] = j; deq2[++dr2] = j;

      if(deq1[st1] <= j - dy) ++st1;
      if(deq2[st2] <= j - dy) ++st2;

      if(j >= dy) {
        mn[i][j] = a[i][deq1[st1]];
        mx[i][j] = a[i][deq2[st2]];
      }
    }
  }

  for(j = dy; j <= m; ++j) {
    int st1 = 1, dr1 = 0, st2 = 1, dr2 = 0;
    for(i = 1; i <= n; ++i) {
      while(st1 <= dr1 && mn[deq1[dr1]][j] >= mn[i][j]) --dr1;
      while(st2 <= dr2 && mx[deq2[dr2]][j] <= mx[i][j]) --dr2;
      deq1[++dr1] = i; deq2[++dr2] = i;

      if(deq1[st1] <= i - dx) ++st1;
      if(deq2[st2] <= i - dx) ++st2;

      if(i >= dx) {
        int gmb = mx[deq2[st2]][j];
        int fnc = mn[deq1[st1]][j];

        if(gmb - fnc == rs) ++cnt;
        else if(gmb - fnc < rs) rs = gmb - fnc, cnt = 1;
      }
    }
  }
}

int main() {
  ifstream cin("struti.in");
  ofstream cout("struti.out");
  ios_base::sync_with_stdio(0);

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

  while(p--) {
    cin >> x >> y;
    rs = INF; cnt = 0;
    solve(x, y);
    if(x != y) solve(y, x);

    cout << rs << ' ' << cnt << '\n';
  }

  return 0;
}