Cod sursa(job #3031553)

Utilizator emazareMazare Emanuel emazare Data 20 martie 2023 12:08:58
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.1 kb
#include <fstream>
#include <deque>

using namespace std;

ifstream fin("struti.in");
ofstream fout("struti.out");

const int Nmax = 1005;
int a[Nmax][Nmax],s[Nmax][Nmax],m[Nmax][Nmax],mm[Nmax][Nmax];
deque<int> dq;

void find_min(int x, int y, int N, int M){
    int i,j;
    for(j=1;j<=M;j++){
        for(i=1;i<=N;i++){
            while(!dq.empty() && a[i][j]<=a[dq.back()][j])
                dq.pop_back();
            dq.push_back(i);
            if(i>=x){
                if(dq.front()<i-x+1)
                    dq.pop_front();
                s[i-x+1][j] = a[dq.front()][j];
            }
        }
        while(!dq.empty())
            dq.pop_back();
        }
    for(i=1;i<=N-x+1;i++){
        for(j=1;j<=M;i++){
            while(!dq.empty() && s[i][j]<=s[i][dq.back()])
                dq.pop_back();
            dq.push_back(j);
            if(j>=y){
                if(dq.front()<j-y+1)
                    dq.pop_front();
                m[i][j-y+1] = s[i][dq.front()];
            }
        }
        while(!dq.empty())
            dq.pop_back();
    }
}

void find_max(int x, int y, int N, int M){
    int i,j;
    for(j=1;j<=M;j++){
        for(i=1;i<=N;i++){
            while(!dq.empty() && a[i][j]>=a[dq.back()][j])
                dq.pop_back();
            dq.push_back(i);
            if(i>=x){
                if(dq.front()<i-x+1)
                    dq.pop_front();
                s[i-x+1][j] = a[dq.front()][j];
            }
        }
        while(!dq.empty())
            dq.pop_back();
    }
    for(i=1;i<=N-x+1;i++){
        for(j=1;j<=M;i++){
            while(!dq.empty() && s[i][j]>=s[i][dq.back()])
                dq.pop_back();
            dq.push_back(j);
            if(j>=y){
                if(dq.front()<j-y+1)
                    dq.pop_front();
                mm[i][j-y+1] = s[i][dq.front()];
            }
        }
        while(!dq.empty())
            dq.pop_back();
    }
}

int main()
{
    int M,N,P,x,y,i,j,p,dif,aux,nr;
    fin >> N >> M >> P;
    for(i=1;i<=N;i++){
        for(j=1;j<=M;j++)
            fin >> a[i][j];
    }
    for(p=0;p<P;p++){
        fin >> x >> y;
        find_min(x,y,N,M);
        find_max(x,y,N,M);
        dif = 8005;
        for(i=1;i<=N-x+1;i++){
            for(j=1;j<=M-y+1;j++){
                if(mm[i][j]-m[i][j]<dif){
                    nr = 1;
                    dif = mm[i][j]-m[i][j];
                }
                if(mm[i][j]-m[i][j] == dif)
                    nr++;
            }
        }
        if(x!=y){
            aux = x;
            x = y;
            y = aux;
            find_min(x,y,N,M);
            find_max(x,y,N,M);
            for(i=1;i<=N-x+1;i++){
                for(j=1;j<=M-y+1;j++){
                    if(mm[i][j]-m[i][j]<dif){
                        nr = 1;
                        dif = mm[i][j]-m[i][j];
                    }
                    if(mm[i][j]-m[i][j] == dif)
                        nr++;
                }
            }
            fout << dif << " " << nr << '\n';
        }
    }
    return 0;
}