Cod sursa(job #3352776)

Utilizator Superffff26Radu Alexandru Gabriel Superffff26 Data 1 mai 2026 13:44:29
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <deque>
#include <algorithm>
#include <iostream>
using namespace std;

int M, N, P, dx, dy, i, j;
int a[2005][2005], mx[2005][2005], mn[2005][2005];
long long rez_min, rez_cnt;

void calc(int R, int C) {
    for (int i = 1; i <= M; ++i) {
        deque<int> d1, d2;
        for (int j = 1; j <= N; ++j) {
            while (!d1.empty() && a[i][d1.back()] <= a[i][j]) 
			d1.pop_back();
            while (!d2.empty() && a[i][d2.back()] >= a[i][j]) 
			d2.pop_back();
            d1.push_back(j); d2.push_back(j);
            if (d1.front() <= j - C) 
			d1.pop_front();
            if (d2.front() <= j - C) 
			d2.pop_front();
            if (j >= C) { 
				mx[i][j - C + 1] = a[i][d1.front()]; mn[i][j - C + 1] = a[i][d2.front()]; 
			}
        }
    }
    for (int j = 1; j <= N - C + 1; ++j) {
        deque<int> d1, d2;
        for (int i = 1; i <= M; ++i) {
            while (!d1.empty() && mx[d1.back()][j] <= mx[i][j]) 
			d1.pop_back();
            while (!d2.empty() && mn[d2.back()][j] >= mn[i][j]) 
			d2.pop_back();
            d1.push_back(i); d2.push_back(i);
            if (d1.front() <= i - R) 
			d1.pop_front();
            if (d2.front() <= i - R) 
			d2.pop_front();
            if (i >= R) {
                int cur = mx[d1.front()][j] - mn[d2.front()][j];
                if (cur < rez_min) { rez_min = cur; rez_cnt = 1; }
                else if (cur == rez_min) rez_cnt++;
            }
        }
    }
}

int main() {
    ifstream in("struti.in");
    ofstream out("struti.out");
    in>>M>>N>>P;
    for (i = 1; i <= M; ++i)
        for (j = 1; j <= N; ++j) in >> a[i][j];
    while (P--) {
        in >> dx >> dy;
        rez_min = 999999999; 
		rez_cnt = 0;
        calc(dx, dy);
        if (dx != dy) calc(dy, dx);
        out << rez_min <<" " <<rez_cnt << "\n";
    }
    return 0;
}