Cod sursa(job #2704196)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 9 februarie 2021 22:32:16
Problema Struti Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f

using namespace std;

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

const int NMAX = 1001;
int N, M, Q, a[NMAX][NMAX], n, m, dif_min, cnt, minA[NMAX][NMAX], maxA[NMAX][NMAX];

void solve() {
    deque<int> maxQ, minQ;
    for(int j = 1; j <= M; ++j) {
        maxQ.clear(), minQ.clear();
        for(int i = 1; i <= N; ++i) {
            if(!maxQ.empty() && maxQ.front() == i - n)
                maxQ.pop_front();
            if(!minQ.empty() && minQ.front() == i - n)
                minQ.pop_front();
            while(!maxQ.empty() && a[maxQ.back()][j] <= a[i][j])
                maxQ.pop_back();
            while(!minQ.empty() && a[minQ.back()][j] >= a[i][j])
                minQ.pop_back();
            maxQ.emplace_back(i), minQ.emplace_back(i);
            maxA[i][j] = a[maxQ.front()][j], minA[i][j] = a[minQ.front()][j];
        }
    }
    for(int i = n; i <= N; ++i) {
        maxQ.clear(), minQ.clear();
        for(int j = 1; j <= M; ++j) {
            if(!maxQ.empty() && maxQ.front() == j - m)
                maxQ.pop_front();
            if(!minQ.empty() && minQ.front() == j - m)
                minQ.pop_front();
            while(!maxQ.empty() && maxA[i][maxQ.back()] <= maxA[i][j])
                maxQ.pop_back();
            while(!minQ.empty() && minA[i][minQ.back()] >= minA[i][j])
                minQ.pop_back();
            maxQ.emplace_back(j), minQ.emplace_back(j);
            if(j >= m) {
                int dif = maxA[i][maxQ.front()] - minA[i][minQ.front()];
                if(dif < dif_min) {
                    dif_min = dif;
                    cnt = 1;
                }
                else
                    if(dif == dif_min)
                        ++cnt;
            }
        }
    }
}

int main() {
    fin >> N >> M >> Q;
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M; ++j)
            fin >> a[i][j];
    while(Q--) {
        fin >> n >> m;
        dif_min = INF, cnt = 0;
        solve();
        if(n != m) {
            swap(n, m);
            solve();
        }
        fout << dif_min << ' ' << cnt << '\n';
    }
}