Cod sursa(job #3194884)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 19 ianuarie 2024 17:57:37
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
deque < pair < int, int > > dq1[1002];
deque < pair < int, int > > dq2[1002];
deque < pair < int, int > > dc1,dc2;
int a[1002][1002];
int n,m,k,M;
void process(int x, int y){
    int i,j;
    for(i = 1; i <= n; i++){
        dq1[i].clear();
        dq2[i].clear();
    }
    for(j = 1; j < x; j++){
        for(i = 1; i <= n; i++){
            while(!dq1[i].empty() && a[i][j] < dq1[i].back().first) dq1[i].pop_back();
            dq1[i].push_back({a[i][j], j});
            while(!dq2[i].empty() && a[i][j] > dq2[i].back().first) dq2[i].pop_back();
            dq2[i].push_back({a[i][j], j});
        }
    }
    for(j = x; j <= m; j++){
        dc1.clear();
        dc2.clear();
        for(i = 1; i < y; i++){
            if(dq1[i].front().second <= j - x) dq1[i].pop_front();
            if(dq2[i].front().second <= j - x) dq2[i].pop_front();
            while(!dq1[i].empty() && a[i][j] < dq1[i].back().first) dq1[i].pop_back();
            dq1[i].push_back({a[i][j], j});
            while(!dq2[i].empty() && a[i][j] > dq2[i].back().first) dq2[i].pop_back();
            dq2[i].push_back({a[i][j], j});

            while(!dc1.empty() && dq1[i].front().first < dc1.back().first) dc1.pop_back();
            dc1.push_back({dq1[i].front().first, i});
            while(!dc2.empty() && dq2[i].front().first > dc2.back().first) dc2.pop_back();
            dc2.push_back({dq2[i].front().first, i});
        }
        for(i = y; i <= n; i++){
            if(dq1[i].front().second <= j - x) dq1[i].pop_front();
            if(dq2[i].front().second <= j - x) dq2[i].pop_front();
            while(!dq1[i].empty() && a[i][j] < dq1[i].back().first) dq1[i].pop_back();
            dq1[i].push_back({a[i][j], j});
            while(!dq2[i].empty() && a[i][j] > dq2[i].back().first) dq2[i].pop_back();
            dq2[i].push_back({a[i][j], j});

            if(dc1.front().second <= i - y) dc1.pop_front();
            if(dc2.front().second <= i - y) dc2.pop_front();
            while(!dc1.empty() && dq1[i].front().first < dc1.back().first) dc1.pop_back();
            dc1.push_back({dq1[i].front().first, i});
            while(!dc2.empty() && dq2[i].front().first > dc2.back().first) dc2.pop_back();
            dc2.push_back({dq2[i].front().first, i});
            if(dc2.front().first - dc1.front().first < M){
                M = dc2.front().first - dc1.front().first;
                k = 1;
            }
            else if(dc2.front().first - dc1.front().first == M) k++;
        }
    }
}
int main()
{
    int p,i,j,x,y;
    fin >> n >> m >> p;
    for(i = 1; i <= n; i++){
        for(j = 1; j <= m; j++) fin >> a[i][j];
    }
    while(p--){
        fin >> x >> y;
        k = 0;
        M = 1e9;
        process(x,y);
        if(x == y){
            fout << M << " " << k << "\n";
            continue;
        }
        process(y,x);
        fout << M << " " << k << "\n";
    }
    return 0;
}