Cod sursa(job #2216034)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 24 iunie 2018 17:03:44
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <fstream>

using namespace std;

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

const int N=1000;

int n,m,q;
int v[N+5][N+5];
int best=(1<<30),cnt=0;

int deq[N+5],st,dr;
int v1[N+5][N+5];
int mi[N+5][N+5];

void slove(int a,int b) {
    for(int j=1;j<=m;j++) {
        st=1;
        dr=0;
        for(int i=1;i<=n;i++) {
            while(st<=dr && v[i][j]<=v[deq[dr]][j])
                dr--;
            if(st<=dr && deq[st]<=i-a)
                st++;
            deq[++dr]=i;
            v1[i][j]=v[deq[st]][j];
        }
    }
    for(int i=a;i<=n;i++) {
        st=1;
        dr=0;
        for(int j=1;j<=m;j++) {
            while(st<=dr && v1[i][j]<=v1[i][deq[dr]])
                dr--;
            if(st<=dr && deq[st]<=j-b)
                st++;
            deq[++dr]=j;
            mi[i][j]=v1[i][deq[st]];
        }
    }
    for(int j=1;j<=m;j++) {
        st=1;
        dr=0;
        for(int i=1;i<=n;i++) {
            while(st<=dr && v[i][j]>=v[deq[dr]][j])
                dr--;
            if(st<=dr && deq[st]<=i-a)
                st++;
            deq[++dr]=i;
            v1[i][j]=v[deq[st]][j];
        }
    }
    for(int i=a;i<=n;i++) {
        st=1;
        dr=0;
        for(int j=1;j<=m;j++) {
            while(st<=dr && v1[i][j]>=v1[i][deq[dr]])
                dr--;
            if(st<=dr && deq[st]<=j-b)
                st++;
            deq[++dr]=j;
            int ma=v1[i][deq[st]];
            int dif=ma-mi[i][j];
            if(j>=b) {
                if(dif<best) {
                    best=dif;
                    cnt=0;
                }
                if(dif==best)
                    cnt++;
            }
        }
    }
}

int main() {
    fin>>n>>m>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            fin>>v[i][j];
    while(q--) {
        int x,y;
        fin>>x>>y;
        best=(1<<30);
        cnt=0;
        slove(x,y);
        if(x!=y)
            slove(y,x);
        fout<<best<<" "<<cnt<<"\n";
    }
    return 0;
}