Cod sursa(job #2055386)

Utilizator herbertoHerbert Mohanu herberto Data 3 noiembrie 2017 10:28:13
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.93 kb
#include<stdio.h>
#include<stdlib.h>
#include<deque>
using namespace std;
#define MAXN 1001

int minim, nr;
deque <int> d1;
deque <int> d2;
deque <int> poz1;
deque <int> poz2;

int v[MAXN][MAXN], matmin[MAXN][MAXN], matmax[MAXN][MAXN];
int matdq(int n, int m, int k){
  int j, i, a;
  for(j=1; j<=m; j++){
    for(i=1; i<=n; i++){
      //pt min
//      printf("DA");
      if(!d1.empty() && i-poz1.front()>=k){
        d1.pop_front();
        poz1.pop_front();
      }
      a=v[i][j];
      while(!d1.empty() && a<=d1.back()){
        d1.pop_back();
        poz1.pop_back();
      }
      d1.push_back(a);
      poz1.push_back(i);
      //pt d2 poz 2
      if(!d2.empty() && i-poz2.front()>=k){
        d2.pop_front();
        poz2.pop_front();
      }
      while(!d2.empty() && a>=d2.back()){
        d2.pop_back();
        poz2.pop_back();
      }
      d2.push_back(a);
      poz2.push_back(i);
      if(i>=k){
        matmin[i][j]=d1.front();
        matmax[i][j]=d2.front();
      }

    }
    while(!d1.empty()){
      d1.pop_back();
      poz1.pop_back();
    }
    while(!d2.empty()){
      d2.pop_back();
      poz2.pop_back();
    }
  }
}

int solve(int n, int m, int x, int y){
  int i, j, a, k;
  k=y;
  for(i=x; i<=n; i++){
    for(j=1; j<=m; j++){
      if(!d1.empty() && j-poz1.front()>=k){
        d1.pop_front();
        poz1.pop_front();
      }
      a=matmin[i][j];
      while(!d1.empty() && a<=d1.back()){
        d1.pop_back();
        poz1.pop_back();
      }
      d1.push_back(a);
      poz1.push_back(j);
      //pt d2 poz 2
      a=matmax[i][j];
      if(!d2.empty() && j-poz2.front()>=k){
        d2.pop_front();
        poz2.pop_front();
      }
      while(!d2.empty() && a>=d2.back()){
        d2.pop_back();
        poz2.pop_back();
      }
      d2.push_back(a);
      poz2.push_back(j);
//      printf("%d %d %d %d\n", i, j, d1.front(), d2.front());
      if(j>=k){
//        printf("%d %d %d %d\n", i, j, d1.front(), d2.front());
        if(d2.front()-d1.front()<minim){
          minim=d2.front()-d1.front();
          nr=1;
        }
        else
          if(d2.front()-d1.front()==minim)
            nr++;
      }
    }
    while(!d1.empty()){
      d1.pop_back();
      poz1.pop_back();
    }
    while(!d2.empty()){
      d2.pop_back();
      poz2.pop_back();
    }
  }
}


int main(){
  FILE*fin=fopen("struti.in", "r");
  FILE*fout=fopen("struti.out", "w");
  int n, m, x, y, i, j, k, p;
  fscanf(fin, "%d%d%d", &n, &m, &p);
  for(i=1; i<=n; i++)
    for(j=1; j<=m; j++)
      fscanf(fin, "%d", &v[i][j]);


//  matdq(n, m, 2);
//  solve(n, m, 2, 2);
//  for(i=1; i<=n; i++){
//    for(j=1; j<=m; j++)
//      printf("%d", matmax[i][j]);
//    printf("\n");
//  }
  for(k=1; k<=p; k++){
    fscanf(fin, "%d%d", &x, &y);
    minim=100000000;
    nr=0;
    matdq(n, m, x);
    solve(n, m, x, y);
    if(x!=y){
      matdq(n, m, y);
      solve(n, m, y, x);
    }
    fprintf(fout, "%d %d\n", minim, nr);
  }
  fclose(fin);
  fclose(fout);
  return 0;
}