Cod sursa(job #1143391)

Utilizator omerOmer Cerrahoglu omer Data 15 martie 2014 15:32:25
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#include<stdio.h>
using namespace std;
FILE *f,*g;
int deck[1001],begin,end,v[2][1001][1001],MIN,NR,n,m,p,maxim[1001][1001],minim[1001][1001];

void pushback(int a){
    deck[end++]=a;
}
void popback(void){
    if (end>begin) end--;
}
void popfront(void){
    if (end>begin) begin++;
}
bool empty(void){
    if (begin==end) return 1;
    return 0;
}
int front(void){
    return deck[begin];
}
bool bigga(int a,int b){
    return (a>b);
}
bool smolla(int a,int b){
    return (a<b);
}
void add(int unde,bool q,int a,int b,bool cmp(int x, int y)){
    while ( !empty() && cmp(deck[end-1],v[unde][a][b]) ) popback();
    if (q) pushback(b);
    else pushback(a);
}
int uberadd(bool q,int unde,int a,int b,int lim,bool cmp(int a,int b)){
    int r=front();
    if (!q) {if (r==a-lim) popfront();}
    else {if (r==b-lim) popfront();}
    add(q,unde,a,b,cmp);
    return r;
}
void clear(void){
    begin=end=0;
}
void initialize(bool q,int unde,int a,int b, bool cmp(int a, int b)){
    int i;
    clear();if (!q){
    for(i=1;i<=a;i++) add(q,unde,i,b,cmp);}
    else for(i=1;i<=b;i++) add(q,unde,a,i,cmp);
}
void create (int dx,int dy,bool cmp(int a,int b)){
    int i,j,q;
    for(i=1;i<=m;i++){
        initialize(0,0,dx,i,cmp);
        for(j=dx+1;j<=n;j++){
            q=uberadd(0,0,j,i,dx,cmp);
            v[1][j-dx][i]=v[0][q][i];
        }
        v[1][n-dx+1][i]=v[0][front()][i];    
    }
    for(i=1;i<=n-dx+1;i++){
        initialize(1,1,i,dy,cmp);
        if (cmp(1,2)){
            for(j=dy+1;j<=m;j++){
                q=uberadd(1,1,i,j,dy,cmp);
                minim[i][j-dy]=v[1][i][q];
            }
            minim[i][m-dy+1]=v[1][i][front()];
        }
        else{
            for(j=dy+1;j<=m;j++){
                q=uberadd(1,1,i,j,dy,cmp);
                maxim[i][j-dy]=v[1][i][q];
            }
            maxim[i][m-dy+1]=v[1][i][front()];
        }

    }
}
 void afla(int dx,int dy){
     create(dx,dy,bigga);
     create(dx,dy,smolla);
     MIN=10000;
     NR=0;
     int i,j;
     for(i=1;i<=n-dx+1;i++)
         for(j=1;j<=m-dy+1;j++)
             if (maxim[i][j]-minim[i][j]<MIN) {MIN=maxim[i][j]-minim[i][j];NR=1;}
             else if (maxim[i][j]-minim[i][j]==MIN) NR++;
    create(dy,dx,bigga);
    create(dy,dx,smolla);
    for(i=1;i<=n-dy+1;i++)
        for(j=1;j<=m-dx+1;j++)
            if (maxim[i][j]-minim[i][j]<MIN) {MIN=maxim[i][j]-minim[i][j];NR=1;}
            else if (maxim[i][j]-minim[i][j]==MIN) NR++;
 }





void read(void){
    f=fopen("struti.in","r");
    g=fopen("struti.out","w");
    fscanf(f,"%d%d%d",&n,&m,&p);
    int i,j,dx,dy;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            fscanf(f,"%d",&v[0][i][j]);
    for(i=1;i<=p;i++){
        fscanf(f,"%d%d",&dx,&dy);
        afla(dx,dy);
        fprintf(g,"%d %d\n",MIN,NR);
    }
}

int main(void){
    read();
    return 0;
}