Cod sursa(job #1832890)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 21 decembrie 2016 09:29:07
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <cstdio>
#include <cctype>
#define BUF_SIZE 1<<17
#define INF 1000000000
#define MAXN 1000
int ans, pos=BUF_SIZE, dq1[MAXN+1], dq2[MAXN+1], sef1[MAXN+1], sef2[MAXN+1];
int rez, nrlin, nrcol, m[MAXN+1][MAXN+1], u[MAXN+1][MAXN+1], e[MAXN+1][MAXN+1];
char buf[BUF_SIZE];
FILE *fin;
inline int nextch(){
    if(pos==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fin);
        pos=0;
    }
    return buf[pos++];
}
inline int read(){
    int x=0;
    char ch=nextch();
    while(!isdigit(ch)){
        ch=nextch();
    }
    while(isdigit(ch)){
        x=10*x+ch-'0';
        ch=nextch();
    }
    return x;
}
inline void solve(int dx, int dy){
    int left1, right1, left2, right2, x;

    for(int j=1; j<=nrcol; j++){
        int st1=0, st2=0, dr1=0, dr2=0;
        for(int i=1; i<=nrlin; i++){
            if((st1<dr1)&&(dq1[st1]==i-dy)){
                st1++;
            }
            while((st1<dr1)&&(m[dq1[dr1-1]][j]>=m[i][j])){
                dr1--;
            }
            dq1[dr1++]=i;
            if((st2<dr2)&&(dq2[st2]==i-dy)){
                st2++;
            }
            while((st2<dr2)&&(m[dq2[dr2-1]][j]<=m[i][j])){
                dr2--;
            }
            dq2[dr2++]=i;
            u[i][j]=m[dq1[st1]][j];
            e[i][j]=m[dq2[st2]][j];
        }
    }

    for(int i=1; i<=nrlin; i++){
        left1=right1=left2=right2=0;
        for(int j=1; j<=nrcol; j++){
            if((left1<right1)&&(sef1[left1]==j-dx)){
                left1++;
            }
            while((left1<right1)&&(u[i][sef1[right1-1]]>=u[i][j])){
                right1--;
            }
            sef1[right1++]=j;
            if((left2<right2)&&(sef2[left2]==j-dx)){
                left2++;
            }
            while((left2<right2)&&(e[i][sef2[right2-1]]<=e[i][j])){
                right2--;
            }
            sef2[right2++]=j;
            x=e[i][sef2[left2]]-u[i][sef1[left1]];
            if((i>=dy)&&(j>=dx)){
                if(ans==x){
                    rez++;
                }else if(ans>x){
                    ans=x;
                    rez=1;
                }
            }
        }
    }
}
int main(){
    int q, i, dx, dy, j;
    FILE *fout;
    fin=fopen("struti.in", "r");
    fout=fopen("struti.out", "w");
    nrlin=read();
    nrcol=read();
    q=read();
    for(i=1; i<=nrlin; i++){
        for(j=1; j<=nrcol; j++){
            m[i][j]=read();
        }
    }
    for(i=0; i<q; i++){
        dx=read();
        dy=read();
        ans=INF;
        rez=0;
        solve(dx, dy);
        if(dx!=dy){
            solve(dy, dx);
        }
        fprintf(fout, "%d %d\n", ans, rez);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}