Cod sursa(job #1659346)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 22 martie 2016 10:25:28
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <cstdio>
#include <cctype>
#define BUF_SIZE 4096
#define INF 1000000000
#define MAXN 1000
int ans, pos=BUF_SIZE, dq1[MAXN+1][MAXN+1], dq2[MAXN+1][MAXN+1], sef1[MAXN+1], sef2[MAXN+1];
int rez, st2[MAXN+1], st1[MAXN+1], dr1[MAXN+1], dr2[MAXN+1], nrlin, nrcol, m[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 i, j, left1, right1, left2, right2, x;
    for(i=1; i<=nrcol; i++){
        st1[i]=st2[i]=dr1[i]=dr2[i]=0;
    }
    for(i=1; i<=nrlin; i++){
        left1=right1=left2=right2=0;
        for(j=1; j<=nrcol; j++){
            if((st1[j]<dr1[j])&&(dq1[j][st1[j]]==i-dy)){
                st1[j]++;
            }
            while((st1[j]<dr1[j])&&(m[dq1[j][dr1[j]-1]][j]>=m[i][j])){
                dr1[j]--;
            }
            dq1[j][dr1[j]++]=i;
            if((st2[j]<dr2[j])&&(dq2[j][st2[j]]==i-dy)){
                st2[j]++;
            }
            while((st2[j]<dr2[j])&&(m[dq2[j][dr2[j]-1]][j]<=m[i][j])){
                dr2[j]--;
            }
            dq2[j][dr2[j]++]=i;
            if((left1<right1)&&(sef1[left1]==j-dx)){
                left1++;
            }
            while((left1<right1)&&(m[dq1[sef1[right1-1]][st1[sef1[right1-1]]]][sef1[right1-1]]>=m[dq1[j][st1[j]]][j])){
                right1--;
            }
            sef1[right1++]=j;
            if((left2<right2)&&(sef2[left2]==j-dx)){
                left2++;
            }
            while((left2<right2)&&(m[dq2[sef2[right2-1]][st2[sef2[right2-1]]]][sef2[right2-1]]<=m[dq2[j][st2[j]]][j])){
                right2--;
            }
            sef2[right2++]=j;
            x=m[dq2[sef2[left2]][st2[sef2[left2]]]][sef2[left2]]-m[dq1[sef1[left1]][st1[sef1[left1]]]][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;
}