Cod sursa(job #2662271)

Utilizator Vaida_Radu_AndreiVaida Radu Andrei Vaida_Radu_Andrei Data 23 octombrie 2020 19:16:18
Problema Struti Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <cstdio>
#include <deque>
#define nMax 1024

using namespace std;

int ar[nMax][nMax],n,m;
int x,y,sol,solCounter;
int arMin[nMax][nMax],arMax[nMax][nMax];
deque <int> qMin,qMax;
deque <int> qAMin,qAMax;

void read(int&q) {
    int i,j;
    scanf("%d%d%d",&n,&m,&q);
    for(i=0;i<n;++i) {
        for(j=0;j<m;++j) {
            scanf("%d",&ar[i][j]);
        }
    }
}

void reset() {
    qMin.clear();
    qMax.clear();
    qAMin.clear();
    qAMax.clear();
}

void createUps() {
    int i,j;
    for(j=0;j<m;++j) {
        qMin.clear();
        qMax.clear();
        for(i=0;i<n;++i) {
            if(!qMin.empty()&&qMin.front()<i-x+1) {
                qMin.pop_front();
            }
            for(;!qMin.empty()&&ar[i][j]<ar[qMin.back()][j];qMin.pop_back());
            qMin.push_back(i);
            arMin[i][j]=ar[qMin.front()][j];
            if(!qMax.empty()&&qMax.front()<i-x+1) {
                qMax.pop_front();
            }
            for(;!qMax.empty()&&ar[i][j]>ar[qMax.back()][j];qMax.pop_back());
            qMax.push_back(i);
            arMax[i][j]=ar[qMax.front()][j];
        }
    }
}

void adv(int li) {
    int j;
    qAMin.clear();
    qAMax.clear();
    for(j=0;j<y-1;++j) {
        for(;!qAMin.empty()&&arMin[li][j]<arMin[li][qAMin.back()];qAMin.pop_back());
        qAMin.push_back(j);
        for(;!qAMax.empty()&&arMax[li][j]>arMax[li][qAMax.back()];qAMax.pop_back());
        qAMax.push_back(j);
    }
    for(;j<m;++j) {
        if(qAMin.front()<=j-y) {
            qAMin.pop_front();
        }
        for(;!qAMin.empty()&&arMin[li][j]<arMin[li][qAMin.back()];qAMin.pop_back());
        qAMin.push_back(j);
        if(qAMax.front()<=j-y) {
            qAMax.pop_front();
        }
        for(;!qAMax.empty()&&arMax[li][j]>arMax[li][qAMax.back()];qAMax.pop_back());
        qAMax.push_back(j);
        if(arMax[li][qAMax.front()]-arMin[li][qAMin.front()]<sol) {
            sol=arMax[li][qAMax.front()]-arMin[li][qAMin.front()];
            solCounter=1;
        }
        else {
            if(arMax[li][qAMax.front()]-arMin[li][qAMin.front()]==sol) {
                ++solCounter;
            }
        }
    }
}

void play() {
    int i;
    scanf("%d%d",&x,&y);
    reset();
    createUps();
    for(i=x-1,sol=1<<30;i<n;++i) {
        adv(i);
    }
    if(x!=y) {
        x-=y;
        y+=x;
        x=y-x;
        reset();
        createUps();
        for(i=x-1;i<n;++i) {
            adv(i);
        }
    }
    printf("%d %d\n",sol,solCounter);
}

int main() {
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    int q,iq;
    read(q);
    for(iq=0;iq<q;++iq) {
        play();
    }
    return 0;
}