Cod sursa(job #2790390)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 28 octombrie 2021 21:12:30
Problema Struti Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.99 kb
#include <iostream>
#include <fstream>
#include <deque>

using namespace std;

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

const int maxN = 1000;
int n, m, t, mat[maxN + 5][maxN + 5], a, b, ans = 0x3f3f3f3f, nr_ans;
deque <int> dqmax, dqmin, dqmaxi[maxN + 5], dqmini[maxN + 5];

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

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

            int val = mat[dqmaxi[dqmax.front()].front()][dqmax.front()] - mat[dqmini[dqmin.front()].front()][dqmin.front()];
            if(j >= y && i >= x)
            {
                if(val == ans)
                    nr_ans++;
                if(val < ans)
                {
                    ans = val;
                    nr_ans = 1;
                }
            }
            /// fout << i << ' ' << j << "   " << dqmaxi[dqmax.front()].front() << ' ' << dqmax.front() << "   " << dqmini[dqmin.front()].front() << ' ' << dqmin.front() <<  "      " << val << '\n';
        }
    }
}

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++)
    {
        fin >> a >> b;
        for(int j = 1; j <= m; j++)
        {
            while(!dqmaxi[j].empty())
                dqmaxi[j].pop_back();
            while(!dqmini[j].empty())
                dqmini[j].pop_back();
        }
        solve(a, b);
        if(b != a)
        {
            for(int j = 1; j <= m; j++)
            {
                while(!dqmaxi[j].empty())
                    dqmaxi[j].pop_back();
                while(!dqmini[j].empty())
                    dqmini[j].pop_back();
            }
            solve(b, a);
        }
        fout << ans << ' ' << nr_ans << '\n';
        ans = 0x3f3f3f3f;
        nr_ans = 0;
    }
    return 0;
}