Cod sursa(job #1073609)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 6 ianuarie 2014 16:59:17
Problema Struti Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.7 kb
#include <iostream>
#include <fstream>
#include <utility>
#include <deque>
using namespace std;

const int NMAX = 1001;
int m, n, p;
int mat[NMAX][NMAX];
int sol, nr;


void solve(int dx, int dy){
  int i,j;
  deque< pair<int, int> > demin, demax;
  int maxim[NMAX][NMAX], minim[NMAX][NMAX];

  for (i = 1; i <= m; ++i){
    //pt fiecare coloana :>
    for (j = 1; j < dx; ++j){

        while (!demin.empty() && demin.back().second >= mat[j][i])
          demin.pop_back();
        demin.push_back(make_pair(j, mat[j][i]));

        while (!demax.empty() && demax.back().second <= mat[j][i])
          demax.pop_back();
        demax.push_back(make_pair(j, mat[j][i]));
      }

    for (j = dx; j<=n; ++j){

        while (!demin.empty() && demin.back().second >= mat[j][i])
          demin.pop_back();
        demin.push_back(make_pair(j, mat[j][i]));

        while (!demax.empty() && demax.back().second <= mat[j][i])
          demax.pop_back();
        demax.push_back(make_pair(j, mat[j][i]));

        if ( demin.front().first <= j-dx )
          demin.pop_front();
        if ( demax.front().first <= j-dx )
          demax.pop_front();

        minim[j][i] = demin.front().second;
        maxim[j][i] = demax.front().second;

    }
    demin.clear();
    demax.clear();
  }
  for(i = dx; i <= n; ++i){

    for(j = 1; j < dy; ++j){

      while (!demin.empty() && demin.back().second >= minim[i][j] )
        demin.pop_back();
      demin.push_back(make_pair(j, minim[i][j]));

      while (!demax.empty() && demax.back().second <= maxim[i][j])
        demax.pop_back();
      demax.push_back(make_pair(j, maxim[i][j]));
    }
    for (j = dy; j<= m; ++j){

      while (!demin.empty() && demin.back().second >= minim[i][j] )
        demin.pop_back();
      demin.push_back(make_pair(j, minim[i][j]));

      while (!demax.empty() && demax.back().second <= maxim[i][j])
        demax.pop_back();
      demax.push_back(make_pair(j, maxim[i][j]));

      if (demin.front().first <=  j - dy )
        demin.pop_front();
      if (demax.front().first <= j - dy )
        demax.pop_front();

      minim[i][j] = demin.front().second;
      maxim[i][j] = demax.front().second;

      int dif = maxim[i][j] - minim[i][j];
      if (dif < sol ){
        sol = dif;
        nr = 1;
      }else if (dif == sol)
        nr++;
    }
    demin.clear();
    demax.clear();
  }
}


int main(){
  int i, j;
  ifstream in("struti.in");
  ofstream out("struti.out");
  in>>n>>m>>p;
  for (i = 1; i <= n; ++i)
    for (j= 1; j<= m; ++j)
      in>>mat[i][j];
  for (i = 1; i<=p; ++i){
    int dx, dy;
    in>>dx>>dy;
    nr = 0;
    sol = 9000;

    solve(dx, dy);
    if (dx != dy) solve(dy,dx);
    out<<sol<<" "<<nr<<"\n";
  }
  in.close();
  out.close();
  return 0;

}