Cod sursa(job #1183658)

Utilizator xtreme77Patrick Sava xtreme77 Data 9 mai 2014 22:23:01
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <cstdio>
#include <deque>
#include <cstring>
#define MAX 1111
#define verif(D,DX) while(!D.empty() and D.front() < i - DX + 1)D.pop_front()
#define zbor(D,op,M) while(!D.empty() and M[i][now] op M[D.back()][now])D.pop_back()
#define bag push_back
using namespace std;
deque <int> mini;
deque <int> maxi;
int mat[MAX][MAX],bigger[MAX][MAX],smaller[MAX][MAX],n,m,ce_trebuie,nr,t;
void citesc();
void build_lin(int now,int maxy);
void build_col(int now,int maxx);
void main_building(int maxx,int maxy);
void afis();
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    citesc();
    afis();
    return 0;
}
void citesc()
{
    scanf("%d%d%d",&n,&m,&t);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            scanf("%d",mat[i]+j);
}
void main_building(int maxx,int maxy){
    for(int i=1;i<=m;build_col(i,maxx),++i);
    for(int i=1;i<=n-maxx+1;build_lin(i,maxy),++i);
}
void build_col(int now,int maxx){
    mini.clear();maxi.clear();
    for(int i=1;i<=n;++i){
        verif(mini,maxx);
        verif(maxi,maxx);
        zbor(mini,<=,mat);
        zbor(maxi,>=,mat);
        mini.bag(i);
        maxi.bag(i);
        if(i>=maxx){
            smaller[now][i-maxx+1]=mat[mini.front()][now];
            bigger[now][i-maxx+1]=mat[maxi.front()][now];
        }
    }
}
void build_lin(int now,int maxy){
    mini.clear();maxi.clear();
    for(int i=1;i<=m;++i){
        verif(mini,maxy);
        verif(maxi,maxy);
        zbor(mini,<=,smaller);
        zbor(maxi,>=,bigger);
        mini.bag(i);
        maxi.bag(i);
        if(i>=maxy){
            int x=bigger[maxi.front()][now]-smaller[mini.front()][now];
            if(x==ce_trebuie)++nr;
            else if (x<ce_trebuie)ce_trebuie=x,nr=1;
        }
    }
}
void afis(){
    int maxx,maxy;
    for(scanf("%d%d",&maxx,&maxy),ce_trebuie=1<<29,nr=0;t;scanf("%d%d",&maxx,&maxy),printf("%d %d\n",ce_trebuie,nr),--t,ce_trebuie=1<<29,nr=0){
        main_building(maxx,maxy);
        if(maxx!=maxy)main_building(maxy,maxx);
    }
}