Cod sursa(job #1066849)

Utilizator mariacMaria Constantin mariac Data 25 decembrie 2013 18:30:25
Problema Struti Scor 90
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 2.84 kb
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int N, M, P, dx, dy, sol, nr_ap;
int a[1005][1005], maxi[1005][1005], mini[1005][1005];
deque<pair<int,int>> dmin, dmax;
int cauta(int x, int y)
{
    int i, j;
    for(j = 1; j <= M; j++)
    {
        for(i = 1; i < x; i++)
        {
            while(!dmax.empty() && dmax.back().first <= a[i][j])dmax.pop_back();
            dmax.push_back(make_pair(a[i][j], i));
            while(!dmin.empty() && dmin.back().first >= a[i][j])dmin.pop_back();
            dmin.push_back(make_pair(a[i][j], i));
        }
        for( i = x ; i <= N; i++)
        {
            while(!dmax.empty() && dmax.back().first <= a[i][j])dmax.pop_back();
            dmax.push_back(make_pair(a[i][j], i));
            while(!dmin.empty() && dmin.back().first >= a[i][j])dmin.pop_back();
            dmin.push_back(make_pair(a[i][j], i));
            if(dmax.front().second <= i - x)dmax.pop_front();
            maxi[i][j] = dmax.front().first;
            if(dmin.front().second <= i - x)dmin.pop_front();
            mini[i][j] = dmin.front().first;
        }
        while(!dmax.empty())dmax.pop_back();
        while(!dmin.empty())dmin.pop_back();
    }
      for(int i = x; i <= N; i++)
    {
        for(j = 1; j < y; j++)
        {
            while(!dmax.empty() && dmax.back().first <= maxi[i][j])dmax.pop_back();
            dmax.push_back(make_pair(maxi[i][j], j));
            while(!dmin.empty() && dmin.back().first >= mini[i][j])dmin.pop_back();
            dmin.push_back(make_pair(mini[i][j], j));
        }
        for( j = y ; j <= M; j++)
        {
            while(!dmax.empty() && dmax.back().first <= maxi[i][j])dmax.pop_back();
            dmax.push_back(make_pair(maxi[i][j], j));
            while(!dmin.empty() && dmin.back().first >= mini[i][j])dmin.pop_back();
            dmin.push_back(make_pair(mini[i][j], j));
            if(dmax.front().second <= j - y)dmax.pop_front();
            if(dmin.front().second <= j - y)dmin.pop_front();
            maxi[i][j] = dmax.front().first;
            mini[i][j] = dmin.front().first;
            int dif = maxi[i][j] - mini[i][j];
            if(dif < sol)
                {
                    sol = dif;
                    nr_ap = 1;
                }
                else if(dif == sol)nr_ap++;
        }
        while(!dmax.empty())dmax.pop_back();
        while(!dmin.empty())dmin.pop_back();
    }




}
int main()
{
    int i, j;

    fin >> N >> M >> P;

    for( i = 1; i <= N; i++)
        for( j = 1;  j <= M; j++)
            fin >> a[i][j];
    for(i = 1; i <= P; i++)
    {
        fin >> dx >> dy;
        sol = 8000;
        cauta(dx, dy);
        if(dx != dy)cauta(dy, dx);
        fout<<sol<<" "<<nr_ap<<"\n";
    }

    return 0;
}