Cod sursa(job #2455143)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 10 septembrie 2019 20:48:59
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.97 kb
#include <bits/stdc++.h>
#define MAX 131072

using namespace std;
const int NMAX = 1010;

FILE *IN;

int ans, nrplace;
int N, M, P;
int mat[NMAX][NMAX], mMaxL[NMAX][NMAX], mMinL[NMAX][NMAX], mMaxC[NMAX][NMAX], mMinC[NMAX][NMAX];

deque <int> dmin, dmax;

int pos, sign;
char f[MAX];

inline void Read(int &nr){
    sign = 0;
    nr = 0;
    while(f[pos] < '0' || f[pos] > '9'){
        if(f[pos] == '-') sign = 1;
        pos++;
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    while(f[pos] >= '0' && f[pos] <= '9'){
        nr = 10 * nr + f[pos++] - '0';
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    if(sign) nr =- nr;
}

inline void read(){
    Read(N); Read(M); Read(P);
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= M; j++)
            Read(mat[i][j]);
}

inline void solve(int x, int y){
    for(int i = 1; i <= N; i++){
        dmin.clear();
        dmax.clear();
        for(int j = 1; j <= M; j++){
            while(!dmin.empty() && mat[i][dmin.back()] > mat[i][j])
                dmin.pop_back();
            dmin.push_back(j);
            if(dmin.front() <= j - x)
                dmin.pop_front();
            if(j - x >= 0)
                mMinL[i][j - x + 1] = mat[i][dmin.front()];

            while(!dmax.empty() && mat[i][dmax.back()] < mat[i][j])
                dmax.pop_back();
            dmax.push_back(j);
            if(dmax.front() <= j - x)
                dmax.pop_front();
            if(j - x >= 0)
                mMaxL[i][j - x + 1] = mat[i][dmax.front()];
        }
    }

    for(int j = 1; j <= M - x + 1; j++){
        dmin.clear();
        dmax.clear();
        for(int i = 1; i <= N; i++){
            while(!dmin.empty() && mMinL[i][j] < mMinL[dmin.back()][j])
                dmin.pop_back();
            dmin.push_back(i);
            if(dmin.front() <= i - y)
                dmin.pop_front();
            if(i - y >= 0)
                mMinC[i - y + 1][j] = mMinL[dmin.front()][j];

            while(!dmax.empty() && mMaxL[i][j] > mMaxL[dmax.back()][j])
                dmax.pop_back();
            dmax.push_back(i);
            if(dmax.front() <= i - y)
                dmax.pop_front();
            if(i - y >= 0)
                mMaxC[i - y + 1][j] = mMaxL[dmax.front()][j];
        }
    }

    for(int i = 1; i <= N - y + 1; i++){
        for(int j = 1; j <= M - x + 1; j++){
            if(ans > mMaxC[i][j] - mMinC[i][j])
                ans = mMaxC[i][j] - mMinC[i][j], nrplace = 1;
            else if(ans == mMaxC[i][j] - mMinC[i][j])
                nrplace++;
        }
    }
}

int main(){

    IN = fopen("struti.in", "r");
    freopen("struti.out", "w", stdout);

    read();

    int x, y;
    for(int i = 1; i <= P; i++){
        ans = 2e9; nrplace = 0;
        Read(x); Read(y);
        solve(x, y);
        if(x != y) solve(y, x);
        printf("%d %d\n", ans, nrplace);
    }

    return 0;
}