Cod sursa(job #904064)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 3 martie 2013 18:02:12
Problema Struti Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define NMAX 1024
#define PMAX 32
#define INF 1 << 20
using namespace std;

int N, M, P;
int V[NMAX][NMAX], s_min[NMAX][NMAX], s_max[NMAX][NMAX], st_min[NMAX], st_max[NMAX], vf_min, b_min, vf_max, b_max;

pair<int, int> solve(int dx, int dy) {
  for (int i = 0; i < N; i++) {
    vf_min = vf_max = -1;
    b_min = b_max = -1;
    for (int j = 0; j < dy - 1; j++) {
      int val = V[i][j];
      while (vf_min >= b_min && V[i][st_min[vf_min]] >= val)
	vf_min--;
      st_min[++vf_min] = j;
      while (vf_max >= b_max && V[i][st_max[vf_max]] <= val)
	vf_max--;
      st_max[++vf_max] = j;
    }
    
    for (int j = dy - 1; j < M; j++) {
      int val = V[i][j];
      while (vf_min >= b_min && V[i][st_min[vf_min]] >= val)
	vf_min--;
      st_min[++vf_min] = j;
      
      if (j - st_min[b_min] >= dy)
	b_min++;
      
      s_min[i][j] = V[i][st_min[b_min]];
      while (vf_max >= b_max && V[i][st_max[vf_max]] <= val)
	vf_max--;
      st_max[++vf_max] = j;
      
      if (j - st_max[b_max] >= dy)
	b_max++;
      
      s_max[i][j] = V[i][st_max[b_max]];
    }
  }
  
  int global_diff = INF, nr = 0;
  
  for (int j = dy - 1; j < M; j++) {
    vf_min = vf_max = -1;
    b_min = b_max = 0;
    for (int i = 0; i < dx - 1; i++) {
      int val = s_min[i][j];
      while(vf_min >= b_min && s_min[st_min[vf_min]][j] >= val)
	vf_min--;
      st_min[++vf_min] = i;
      
      val = s_max[i][j];
      while(vf_max >= b_max && s_max[st_max[vf_max]][j] <= val)
	vf_max--;
      st_max[++vf_max] = i;
    }
    
    for (int i = dx - 1; i < N; i++) {
      int val = s_min[i][j];
      while(vf_min >= b_min && s_min[st_min[vf_min]][j] >= val)
	vf_min--;
      st_min[++vf_min] = i;
      
      if (i - st_min[b_min] >= dx)
	b_min++;
      
      val = s_max[i][j];
      while(vf_max >= b_max && s_max[st_max[vf_max]][j] <= val)
	vf_max--;
      st_max[++vf_max] = i;
      
      if (i - st_max[b_max] >= dx)
	b_max++;
      
      int pos_min = s_min[st_min[b_min]][j];
      int pos_max = s_max[st_max[b_max]][j];
      
      if (pos_max - pos_min < global_diff)
	global_diff = pos_max - pos_min, nr = 1;
      else
	if (pos_max - pos_min == global_diff)
	  nr++;
    }
  }
  return pair<int, int>(global_diff, nr);
}
int main()
{
  freopen("struti.in", "r", stdin);
  freopen("struti.out", "w", stdout);
  
  scanf("%d %d %d", &N, &M, &P);
  for (int i = 0; i < N; i++)
      for (int j = 0; j < M; j++)
	scanf ("%d", &V[i][j]);
      
  for (int i = 0; i < P; i++) {
    int x, y;
    scanf ("%d %d", &x, &y);
    pair<int, int> res = solve(x, y);
    
    if (x != y) {
      pair<int, int> s_res = solve(y, x);
      if (s_res.first > res.first);
      else if (s_res.first == res.first)
	    res.second += s_res.second;
	   else
	     res = s_res;
    }
    
    printf("%d %d\n", res.first, res.second);
  }
  return 0;
}