Cod sursa(job #880351)

Utilizator stefanzzzStefan Popa stefanzzz Data 16 februarie 2013 17:22:14
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.26 kb
#include <fstream>
#include <queue>
#include <vector>
#define INF 32000
#define MAXN 1005
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");

struct element{
    short int val,poz;};

short int n,m,p,a[MAXN][MAXN],mn,aux,dx,dy,mn1,mx1;
element el;
int mncnt;

deque<element> dq1,dq2;
vector<short int> v1[MAXN],v2[MAXN];

int main()
{
    short int i,j,k;
    f>>n>>m>>p;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            f>>a[i][j];
    for(k=1;k<=2*p;k++){
        if(k%2){
            mn=INF;
            f>>dx>>dy;}
        else{
            if(dx==dy){
                g<<mn<<' '<<mncnt<<'\n';
                continue;}
            aux=dx;
            dx=dy;
            dy=aux;}
        for(j=1;j<=m;j++){
            for(i=1;i<dx;i++){
                el.poz=i;
                el.val=a[i][j];
                while(!dq1.empty()&&dq1.back().val>el.val)
                    dq1.pop_back();
                dq1.push_back(el);
                while(!dq2.empty()&&dq2.back().val<el.val)
                    dq2.pop_back();
                dq2.push_back(el);}
            for(i=dx;i<=n;i++){
                el.poz=i;
                el.val=a[i][j];
                while(!dq1.empty()&&dq1.back().val>el.val)
                    dq1.pop_back();
                dq1.push_back(el);
                while(!dq2.empty()&&dq2.back().val<el.val)
                    dq2.pop_back();
                dq2.push_back(el);
                while(dq1.front().poz<=i-dx)
                    dq1.pop_front();
                v1[j].push_back(dq1.front().val);
                el=dq2.front();
                while(dq2.front().poz<=i-dx)
                    dq2.pop_front();
                v2[j].push_back(dq2.front().val);}
            dq1.clear();
            dq2.clear();}
        for(i=0;i<v1[1].size();i++){
            for(j=1;j<dy;j++){
                el.poz=j;
                el.val=v1[j][i];
                while(!dq1.empty()&&dq1.back().val>el.val)
                    dq1.pop_back();
                dq1.push_back(el);
                el.val=v2[j][i];
                while(!dq2.empty()&&dq2.back().val<el.val)
                    dq2.pop_back();
                dq2.push_back(el);}
            for(j=dy;j<=m;j++){
                el.poz=j;
                el.val=v1[j][i];
                while(!dq1.empty()&&dq1.back().val>el.val)
                    dq1.pop_back();
                dq1.push_back(el);
                el.val=v2[j][i];
                while(!dq2.empty()&&dq2.back().val<el.val)
                    dq2.pop_back();
                dq2.push_back(el);
                while(dq1.front().poz<=j-dy)
                    dq1.pop_front();
                mn1=dq1.front().val;
                while(dq2.front().poz<=j-dy)
                    dq2.pop_front();
                mx1=dq2.front().val;
                if(mx1-mn1<mn){
                    mn=mx1-mn1;
                    mncnt=0;}
                if(mx1-mn1==mn)
                    mncnt++;}
            dq1.clear();
            dq2.clear();}
        for(j=1;j<=m;j++){
            v1[j].clear();
            v2[j].clear();}
        if(k%2==0)
            g<<mn<<' '<<mncnt<<'\n';}
    f.close();
    g.close();
    return 0;
}