Cod sursa(job #2429659)

Utilizator rd211Dinucu David rd211 Data 10 iunie 2019 20:11:53
Problema Struti Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int m,n,p;
deque<int> minim;
deque<int> maxim;
int Map[1100][1100],Min[1100][1100],Max[1100][1100],My,Mx;
void calc(int dx,int dy,int &r1,int &r2)
{
    int val,minFinal=1000000,counting=0;
    for(int r = 1; r<=2; r++)
    {
        My = 0;
        Mx = 0;
        for(int i = 1; i<=n; i++)
        {
            maxim.clear();
            minim.clear();
            My++;
            Mx = 0;
            for(int j = 1; j<=m; j++)
            {
                while(minim.size() && Map[i][minim.back()] >= Map[i][j])
                    minim.pop_back();
                while(maxim.size() && Map[i][maxim.back()] <= Map[i][j])
                    maxim.pop_back();
                maxim.push_back(j);
                minim.push_back(j);
                if(maxim.front() == j-dx)
                    maxim.pop_front();
                if(minim.front() == j-dx)
                    minim.pop_front();
                if(j>=dx)
                {
                    Min[My][++Mx] = Map[i][minim.front()];
                    Max[My][Mx] = Map[i][maxim.front()];
                }
            }
        }

        for(int j = 1; j<=Mx; j++)
        {
            minim.clear();
            maxim.clear();
            for(int i = 1; i<=My; i++)
            {
                while(minim.size() && Min[minim.back()][j] >= Min[i][j])
                    minim.pop_back();

                while(maxim.size() && Max[maxim.back()][j] <= Max[i][j])
                    maxim.pop_back();

                maxim.push_back(i);
                minim.push_back(i);

                if(maxim.front()==i-dy)
                    maxim.pop_front();

                if(minim.front()==i-dy)
                    minim.pop_front();

                val = Max[maxim.front()][j]-Min[minim.front()][j];
                if(i>=dy && val<minFinal)
                {
                    minFinal = val;
                    counting = 0;
                }
                if(i>=dy && val == minFinal)
                    counting++;
            }
        }
        if(dx!=dy)
            swap(dx,dy);
        else
            r=2;
    }
    r1=minFinal;
    r2=counting;
}

int main()
{
    int dx,dy,r1,r2;
    fin>>m>>n>>p;
    for(int i = 1; i<=n; i++)
        for(int j = 1; j<=m; j++)
            fin>>Map[i][j];

    for(int q = 1; q<=p; q++)
    {
        fin>>dx>>dy;
        calc(dx,dy,r1,r2);
        fout<<r1<<" "<<r2<<'\n';
    }
    return 0;
}