Cod sursa(job #3360054)

Utilizator genius112Prodan Alexandra genius112 Data 8 iulie 2026 13:46:28
Problema Struti Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <deque>

using namespace std;

int dx, dy, n, m, a[1001][1001], mini, i, j, p, x, y, nr, nrmx, nrmn, part[1001][1001], mi[1001][1001], mx[1001][1001];
deque <int> dq;

void idkmin()
{
    for ( i = 1; i <= n; i++ ) {
        for ( j = 1; j <= m; j++ ) {
            if ( !dq.empty() && dq.front()+dy == j ) {
                dq.pop_front();
            }
            while ( !dq.empty() && a[i][j] < a[i][dq.back()] ) {
                dq.pop_back();
            }
            dq.push_back(j);
            part[i][j] = a[i][dq.front()];
        }
        while ( !dq.empty() ) {
            dq.pop_back();
        }
    }
    for ( i = 1; i <= m; i++ ) {
        for ( j = 1; j <= n; j++ ) {
            if ( !dq.empty() && dq.front()+dx == j ) {
                dq.pop_front();
            }
            while ( !dq.empty() && part[j][i] < part[dq.back()][i] ) {
                dq.pop_back();
            }
            dq.push_back(j);
            mi[j][i] = part[dq.front()][i];
        }
        while ( !dq.empty() ) {
            dq.pop_back();
        }
    }

}
void idkmax()
{
    for ( i = 1; i <= n; i++ ) {
        for ( j = 1; j <= m; j++ ) {
            if ( !dq.empty() && dq.front()+dy == j ) {
                dq.pop_front();
            }
            while ( !dq.empty() && a[i][j] > a[i][dq.back()] ) {
                dq.pop_back();
            }
            dq.push_back(j);
            part[i][j] = a[i][dq.front()];
        }
        while ( !dq.empty() ) {
            dq.pop_back();
        }
    }
    for ( i = 1; i <= m; i++ ) {
        for ( j = 1; j <= n; j++ ) {
            if ( !dq.empty() && dq.front()+dx == j ) {
                dq.pop_front();
            }
            while ( !dq.empty() && part[j][i] > part[dq.back()][i] ) {
                dq.pop_back();
            }
            dq.push_back(j);
            mx[j][i] = part[dq.front()][i];
        }
        while ( !dq.empty() ) {
            dq.pop_back();
        }
    }
    for ( i = dx; i <= n; i++ ) {
        for ( j = dy; j <= m; j++ ) {
            if ( mini > mx[i][j]-mi[i][j] ) {
                mini = mx[i][j]-mi[i][j];
                nr = 1;
            }
            else if ( mini == mx[i][j]-mi[i][j] ) {
                nr++;
            }
        }
    }
}

int main() 
{
    ifstream cin ("struti.in");
    ofstream cout ("struti.out");

    cin >> n >> m >> p;

    for ( i = 1; i <= n; i++ ) {
        for ( j = 1; j <= m; j++ ) {
            cin >> a[i][j];
        }
    }
    while ( p > 0 ) {
        cin >> dx >> dy;
        mini = 8000;
        nr = 1;
        idkmin();
        idkmax();
        if ( dx != dy ) {
            swap(dx, dy);
            idkmin();
            idkmax();
        }
        cout << mini << ' ' << nr << '\n';
        p--;
    }

    return 0;
}