Cod sursa(job #2059659)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 7 noiembrie 2017 13:07:24
Problema Struti Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fi("struti.in");
ofstream fo("struti.out");
const int LIM = 1001;

deque < pair<int,int> > primmax[LIM], primmin[LIM];
deque <int> secundmin, secundmax;

int hei[LIM][LIM], n, m;

inline int maxim(int col){
  return hei[(primmax[col].front()).first][(primmax[col].front()).second];
}

inline int minim(int col){
  return hei[(primmin[col].front()).first][(primmin[col].front()).second];
}

inline void dreapta(int lin, int col){
  while(primmax[col].size() > 0 && hei[(primmax[col].back()).first][(primmax[col].back()).second] <= hei[lin][secundmax.front()])
    primmax[col].pop_back();
  primmax[col].push_back(make_pair(lin, secundmax.front()));
  while(primmin[col].size() > 0 && hei[(primmin[col].back()).first][(primmin[col].back()).second] >= hei[lin][secundmin.front()])
    primmin[col].pop_back();
  primmin[col].push_back(make_pair(lin, secundmin.front()));
}

inline void stanga(int lin, int col, int d){
  if(lin - primmax[col].front().first + 1 > d)
    primmax[col].pop_front();
  if(lin - primmin[col].front().first + 1 > d)
    primmin[col].pop_front();
}

inline void calc(int d1, int d2, int* mn, int* nr){
  int i, j;
  *mn = 2000000000;
  for(j = 1; j <= m; j++){
    primmax[j].clear();
    primmin[j].clear();
  }
  for(i = 1; i <= n; i++){
    secundmin.clear();
    secundmax.clear();
    for(j = 1; j <= m; j++){
      while(secundmin.size() > 0 && hei[i][secundmin.back()] >= hei[i][j])
        secundmin.pop_back();
      secundmin.push_back(j);
      if(j - secundmin.front() + 1 > d2)
        secundmin.pop_front();
      while(secundmax.size() > 0 && hei[i][secundmax.back()] <= hei[i][j])
        secundmax.pop_back();
      secundmax.push_back(j);
      if(j - secundmax.front() + 1 > d2)
        secundmax.pop_front();
      if(j >= d2){
        dreapta(i,j);
        stanga(i,j,d1);
        if(i >= d1){
          if(maxim(j) - minim(j) < *mn){
            *mn = maxim(j) - minim(j);
            *nr = 1;
          }
          else if(maxim(j) - minim(j) == *mn)
            *nr = *nr + 1;
        }
      }
    }
  }
}

int main()
{
  int minim1, minim2, nr1, nr2, i, j, p, d1, d2;
  fi >> n >> m >> p;
  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++)
      fi >> hei[i][j];
  for(; p > 0; p--){
    fi >> d1 >> d2;
    calc(d1, d2, &minim1, &nr1);
    calc(d2, d1, &minim2, &nr2);
    if(minim1 > minim2)
      fo << minim1 << ' ' << nr1 << '\n';
    else if(minim2 > minim1)
      fo << minim2 << ' ' << nr2 << '\n';
    else{
      if(d1 != d2)
        fo << minim1 << ' ' << nr1 + nr2 << '\n';
      else
        fo << minim2 << ' ' << nr1 << '\n';
    }
  }
  return 0;
}