Cod sursa(job #2085378)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 10 decembrie 2017 01:00:26
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.42 kb
#include <bits/stdc++.h>
#define MAXN 1000

#define BUF_SIZE 1 << 14
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi,*fo;
inline char nextch(){
    if(pbuf==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fi);
        pbuf=0;
    }
    return buf[pbuf++];
}
inline short nextnum(){
    short a = 0;
    char c = nextch();
    while(!isdigit(c))
        c = nextch();
    while(isdigit(c)){
        a = a * 10 + c - '0';
        c = nextch();
    }
    return a;
}

short m, n;
short a;
struct Ans{
    short min;
    int nr;
};
short v[1001][1001];
short d[1001][1003];
short D[1001][1003];
short min[1003], max[1003];
short minval, maxval;
short e[1001];
short E[1001];

inline Ans Compute(short dx, short dy){
    Ans ans;
    ans.min = 10000;

    for(short i = 1; i <= m; ++i){
        d[i][0] = 2;
        d[i][1] = 1;
        D[i][0] = 2;
        D[i][1] = 1;
    }
    for(short j = 1; j <= n; ++j){
        min[0] = 2;
        min[1] = 1;
        max[0] = 2;
        max[1] = 1;
        for(short i = 1; i <= m; ++i){
            //minim
            if(d[i][0] <= d[i][1] && j - d[i][d[i][0]] + 1 > dx)
                d[i][0]++;
            while(d[i][0] <= d[i][1] && v[d[i][d[i][1]]][i] > v[j][i])
                d[i][1]--;
            d[i][++d[i][1]] = j;
            e[i] = d[i][d[i][0]];
            //maxim
            if(D[i][0] <= D[i][1] && j - D[i][D[i][0]] + 1 > dx)
                D[i][0]++;
            while(D[i][0] <= D[i][1] && v[D[i][D[i][1]]][i] < v[j][i])
                D[i][1]--;
            D[i][++D[i][1]] = j;
            E[i] = D[i][D[i][0]];
        }
        for(short i = 1; i <= m; ++i){
            //minim
            if(min[0] <= min[1] && i - min[min[0]] + 1 > dy)
                min[0]++;
            a = v[e[i]][i];
            while(min[0] <= min[1] && v[e[min[min[1]]]][min[min[1]]] > a)
                min[1]--;
            min[++min[1]] = i;
            //maxim
            if(max[0] <= max[1] && i - max[max[0]] + 1 > dy)
                max[0]++;
            a = v[E[i]][i];
            while(max[0] <= max[1] && v[E[max[max[1]]]][max[max[1]]] < a)
                max[1]--;
            max[++max[1]] = i;

            minval = v[e[min[min[0]]]][min[min[0]]];
            maxval = v[E[max[max[0]]]][max[max[0]]];
            if(i >= dy && j >= dx){
                if(maxval - minval < ans.min){
                    ans.min = maxval - minval;
                    ans.nr = 0;
                }
                if(maxval - minval == ans.min)
                    ans.nr++;
            }
        }
    }

    return ans;
}

int main(){
    fi=fopen("struti.in","r");
    fo=fopen("struti.out","w");

    short p, dx, dy;
    m = nextnum(), n = nextnum(), p = nextnum();
    for(short i = 1; i <= m; ++i)
        for(short j = 1; j <= n; ++j)
            v[j][i] = nextnum();
    for(short i = 1; i <= p; ++i){
        dx = nextnum();
        dy = nextnum();
        Ans a = Compute(dx, dy);
        Ans b = Compute(dy, dx);
        if(dx == dy)
            fprintf(fo,"%hd %d\n", a.min, a.nr);
        else{
            if(a.min < b.min)
                fprintf(fo,"%hd %d\n", a.min, a.nr);
            else if(a.min == b.min)
                fprintf(fo,"%hd %d\n", a.min, a.nr + b.nr);
            else
                fprintf(fo,"%hd %d\n", b.min, b.nr);
        }
    }

    fclose(fi);
    fclose(fo);
    return 0;
}