Cod sursa(job #2905548)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 22 mai 2022 13:14:48
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.37 kb

#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

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

const int maxN = 1005;
int mat[maxN][maxN], amaxi[maxN][maxN], amini[maxN][maxN];
int n, m, t, val, nr;
deque <int> dqmax, dqmin;

void solve(int x, int y)
{
    for(int i = 1; i <= n; i++)
    {
        dqmax.clear();
        dqmin.clear();
        for(int j = 1; j <= m; j++)
        {
            while(!dqmax.empty() && mat[i][j] >= mat[i][dqmax.back()])
                dqmax.pop_back();
            dqmax.push_back(j);
            if(dqmax.front() == j - y)
                dqmax.pop_front();

            while(!dqmin.empty() && mat[i][j] <= mat[i][dqmin.back()])
                dqmin.pop_back();
            dqmin.push_back(j);
            if(dqmin.front() == j - y)
                dqmin.pop_front();

            if(j >= y)
            {
                amaxi[i][j] = mat[i][dqmax.front()];
                amini[i][j] = mat[i][dqmin.front()];
            }
        }
    }
    for(int j = y; j <= m; j++)
    {
        dqmax.clear();
        dqmin.clear();
        for(int i = 1; i <= n; i++)
        {
            while(!dqmax.empty() && amaxi[i][j] >= amaxi[dqmax.back()][j])
                dqmax.pop_back();
            dqmax.push_back(i);
            if(dqmax.front() == i - x)
                dqmax.pop_front();

            while(!dqmin.empty() && amini[i][j] <= amini[dqmin.back()][j])
                dqmin.pop_back();
            dqmin.push_back(i);
            if(dqmin.front() == i - x)
                dqmin.pop_front();

            int diff = amaxi[dqmax.front()][j] - amini[dqmin.front()][j];
            if(i >= x)
            {
                if(diff == val)
                    nr++;
                if(diff < val)
                {
                    val = diff;
                    nr = 1;
                }
            }
        }
    }
}


int main()
{
    ios::sync_with_stdio(false);
    fin >> n >> m >> t;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            fin >> mat[i][j];
    for(int i = 1; i <= t; i++)
    {
        int a, b;
        fin >> a >> b;
        val = 0x3f3f3f3f;
        nr = 0;
        solve(a, b);
        if(b != a)
            solve(b, a);
        fout << val << ' ' << nr << '\n';
    }
    return 0;
}