Cod sursa(job #3356184)

Utilizator rares89_Dumitriu Rares rares89_ Data 30 mai 2026 02:31:01
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <bits/stdc++.h>

using namespace std;

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

int m, n, p;
int a[1005][1005];
int rmin[1005][1005], rmax[1005][1005];
int dq1[1005], dq2[1005];
int best_diff, cnt;

void solve_window(int dx, int dy) {
    if (dx > m || dy > n) return;
    
    for (int i = 1; i <= m; ++i) {
        int st1 = 1, dr1 = 0;
        int st2 = 1, dr2 = 0;
        for (int j = 1; j <= n; ++j) {
            while (st1 <= dr1 && a[i][dq1[dr1]] >= a[i][j]) dr1--;
            dq1[++dr1] = j;
            
            while (st2 <= dr2 && a[i][dq2[dr2]] <= a[i][j]) dr2--;
            dq2[++dr2] = j;
            
            while (st1 <= dr1 && dq1[st1] <= j - dy) st1++;
            while (st2 <= dr2 && dq2[st2] <= j - dy) st2++;
            
            if (j >= dy) {
                rmin[i][j] = a[i][dq1[st1]];
                rmax[i][j] = a[i][dq2[st2]];
            }
        }
    }
    
    for (int j = dy; j <= n; ++j) {
        int st1 = 1, dr1 = 0;
        int st2 = 1, dr2 = 0;
        for (int i = 1; i <= m; ++i) {
            while (st1 <= dr1 && rmin[dq1[dr1]][j] >= rmin[i][j]) dr1--;
            dq1[++dr1] = i;
            
            while (st2 <= dr2 && rmax[dq2[dr2]][j] <= rmax[i][j]) dr2--;
            dq2[++dr2] = i;
            
            while (st1 <= dr1 && dq1[st1] <= i - dx) st1++;
            while (st2 <= dr2 && dq2[st2] <= i - dx) st2++;
            
            if (i >= dx) {
                int diff = rmax[dq2[st2]][j] - rmin[dq1[st1]][j];
                if (diff < best_diff) {
                    best_diff = diff;
                    cnt = 1;
                } else if (diff == best_diff) {
                    cnt++;
                }
            }
        }
    }
}

int main() {
    fin >> m >> n >> p;
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            fin >> a[i][j];
        }
    }
    
    for (int i = 1; i <= p; ++i) {
        int dx, dy;
        fin >> dx >> dy;
        
        best_diff = 2e9;
        cnt = 0;
        
        solve_window(dx, dy);
        if (dx != dy) {
            solve_window(dy, dx);
        }
        
        fout << best_diff << " " << cnt << "\n";
    }
    
    fin.close();
    fout.close();
    return 0;
}