Cod sursa(job #2586252)

Utilizator david.teacaDavid Stefan Teaca david.teaca Data 20 martie 2020 10:33:31
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 kb
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
 
const int NAX = 1010;
 
ifstream f("struti.in");
ofstream g("struti.out");
 
int t, n, m;
int ma[ NAX ][ NAX ];
int maxi[ NAX ][ NAX ], mini[ NAX ][ NAX ], ras, c_ras;
int dx, dy;
 
void fa(int dx, int dy)
{
    deque<int>Qmin, Qmax;
    for(int i = 1 ; i <= n ; ++i)
    {
            for(int j = 1 ; j <= m ; ++j)
        {
            while(!Qmin.empty() && ma[ i ][ j ] <= ma[ i ][ Qmin.back()])
                Qmin.pop_back();
            Qmin.push_back(j);
            if(j >= dx )
            {
                if(j - dx == Qmin.front())
                    {
                        Qmin.pop_front();
                    }
                mini[ i ][ j ] = ma[ i ][ Qmin.front()];
            }
 
            while(!Qmax.empty() && ma[ i ][ j ] >= ma[ i ][ Qmax.back()])
                Qmax.pop_back();
            Qmax.push_back(j);
            if(j >= dx )
            {
                if(j - dx == Qmax.front())
                    Qmax.pop_front();
                maxi[ i ][ j ] = ma[ i ][ Qmax.front()];
            }
        }
            Qmax.clear();
            Qmin.clear();
    }
 
    for(int j = dx ; j <= m ; ++j)
    {
        for(int i = 1 ; i <= n ; ++i)
        {
            while(!Qmin.empty() && mini[ i ][ j ] <= mini[ Qmin.back() ][ j ])
                Qmin.pop_back();
            Qmin.push_back(i);
            while(!Qmax.empty() && maxi[ i ][ j ] >= maxi[ Qmax.back() ][j])
                Qmax.pop_back();
            Qmax.push_back(i);
            if(i >= dy )
            {
                if(i - dy == Qmin.front())
                    Qmin.pop_front();
                if(i - dy == Qmax.front())
                    Qmax.pop_front();
                int tine = maxi[ Qmax.front()][j] - mini[ Qmin.front() ][ j ];
                if(tine< ras)
                {
                    ras = tine;
                    c_ras = 1;
                } else if( tine == ras )
                        c_ras++;
            }
        }
            Qmax.clear();
            Qmin.clear();
    }
}
 
int main()
{
   f >> n >> m >> t;
   for(int i = 1 ; i <= n ; ++i)
    for(int j = 1 ; j <= m ; ++j)
        f >> ma[ i ][ j ];
   while(t--)
   {
       f >> dx >> dy;
       ras = 1 << 30;
       fa(dx, dy);
       if(dx != dy)
        fa(dy, dx);
       g << ras << ' ' << c_ras << '\n';
   }
 
}