Cod sursa(job #1244803)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 18 octombrie 2014 11:09:01
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <cstdio>
#include <deque>

#define NMAX 1007

using namespace std;

deque < int > DeqMin, DeqMax;
int DpMin[NMAX][NMAX], DpMax[NMAX][NMAX], a[NMAX][NMAX];
int n, m, Ans, Nr;

void solve(int x, int y){
    for(int i = 1; i <= n; ++i, DeqMin.clear(), DeqMax.clear())
        for(int j = 1; j <= m; ++ j){
            while(! DeqMin.empty() && a[i][DeqMin.back()] >= a[i][j])
                DeqMin.pop_back();
            DeqMin.push_back(j);
            if(DeqMin.front() == j - y)
                DeqMin.pop_front();
            if(j >= y && !DeqMin.empty())
                DpMin[i][j] = a[i][DeqMin.front()];
            while(! DeqMax.empty() && a[i][DeqMax.back()] <= a[i][j])
                DeqMax.pop_back();
            DeqMax.push_back(j);
            if(DeqMax.front() == j - y)
                DeqMax.pop_front();
            if(j >= y && !DeqMax.empty())
                DpMax[i][j] = a[i][DeqMax.front()];
        }
    /**for(int i = 1; i <= n; ++i, printf("\n"))
        for(int j = 1; j <= m; ++j)
            printf("%d ", DpMin[i][j]);
    printf("\n");
    for(int i = 1; i <= n; ++i, printf("\n"))
        for(int j = 1; j <= m; ++j)
            printf("%d ", DpMax[i][j]);**/
    for(int i = y; i <= m; ++i, DeqMin.clear(), DeqMax.clear())
        for(int j = 1; j <= n; ++ j){
            while(! DeqMin.empty() && DpMin[DeqMin.back()][i] >= DpMin[j][i])
                DeqMin.pop_back();
            while(!DeqMin.empty() && DeqMin.front() <= j - x)
                DeqMin.pop_front();
            DeqMin.push_back(j);
            while(! DeqMax.empty() && DpMax[DeqMax.back()][i] <= DpMax[j][i])
                DeqMax.pop_back();
            while(!DeqMax.empty() && DeqMax.front() <= j - x)
                DeqMax.pop_front();
            DeqMax.push_back(j);
            if(j >= x){
                int Aux = DpMax[DeqMax.front()][i] - DpMin[DeqMin.front()][i];
                ///printf("%d\n", Aux);
                if(Aux == Ans)
                    ++Nr;
                if(Aux < Ans){
                    Ans = Aux;
                    Nr = 1;
                }
            }
        }
}

int main(){
    int T;
    freopen("struti.in", "r", stdin);
    freopen("struti.out", "w", stdout);
    scanf("%d %d %d", &n, &m, &T);
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            scanf("%d", &a[i][j]);
    while(T){
        --T;
        int x, y;
        scanf("%d %d", &x, &y);
        Ans = 100000000;
        Nr = 0;
        solve(x, y);
        if(x != y)
            solve(y, x);
        printf("%d %d\n", Ans, Nr);
    }
    return 0;
}