Cod sursa(job #1542751)

Utilizator AeroHHorea Stefan AeroH Data 5 decembrie 2015 17:09:19
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <fstream>
#include <iostream>
#include <deque>
#define N 1002
using namespace std;

ifstream f("struti.in");
ofstream g("struti.out");

int M[N][N],m1[N][N],m2[N][N],a[N][N],i,j,n,m,q,x,y,rasp,nr;
deque<int> mini,maxi;

void showmaxi(deque<int> d)
{
    cout<<"maxi:";
    for (int i=0;i<d.size();++i)
        cout<<m2[j][d[i]]<<" ";
    cout<<endl;
}
void showmini(deque<int> d)
{
    cout<<"mini:";
    for (int i=0;i<d.size();++i)
        cout<<m1[j][d[i]]<<" ";
    cout<<endl;
}

void showm(int a[][N])
{
    for (int i = 1;i<=n;++i,g<<'\n')
        for(int j = 1;j<=m;++j)
            g<<a[i][j]<<" ";
    g<<'\n';
}

void Solve(int x,int y)
{
    --x,--y;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            m1[i][j] = m2[i][j] = M[i][j];

    for (i=1;i<=n;++i)
        {
            for(j=1;j<=m;++j)
            {
                while(mini.size() && M[i][mini.back()] > M[i][j])mini.pop_back();
                    mini.push_back(j);
                if (j - y > mini.front())mini.pop_front();
                while(maxi.size() && M[i][maxi.back()] < M[i][j])maxi.pop_back();
                    maxi.push_back(j);
                if (j - y > maxi.front())maxi.pop_front();
                m1[i][j]=M[i][mini.front()],
                m2[i][j]=M[i][maxi.front()];
                //show(mini);
            }
            mini.clear();
            maxi.clear();
        }

    //showm(m1);
    //showm(m2);
    ++x,++y;
    for (j=y;j<=m;++j)
        {
            for(i=1;i<=n;++i)
            {
                while(mini.size() && m1[mini.back()][j] > m1[i][j])mini.pop_back();
                    mini.push_back(i);
                if (i - x >= mini.front())mini.pop_front();
                while(maxi.size() && m2[maxi.back()][j] < m2[i][j])maxi.pop_back();
                    maxi.push_back(i);
                if (i - x >= maxi.front())maxi.pop_front();
                if (i - x >= 0)
                {
                    if (m2[maxi.front()][j] - m1[mini.front()][j] < rasp)
                    {
                        rasp = m2[maxi.front()][j] - m1[mini.front()][j];
                        nr = 1;
                    }
                    else if (m2[maxi.front()][j] - m1[mini.front()][j] == rasp)
                        ++nr;
                        //g<<m2[j][maxi.front()] << " " << m1[j][mini.front()]<<'\n';
                }

            }
            mini.clear();
            maxi.clear();

        }
}
int main()
{
   f>>n>>m>>q;

   for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
        f>>M[i][j];

   while(q--)
   {
       f>>x>>y;
       rasp=1<<30,nr=0;
       Solve(x,y);
       if(x!=y)Solve(y,x);
       g<<rasp<<" "<<nr<<'\n';
   }
    return 0;
}