Cod sursa(job #2065263)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 13 noiembrie 2017 17:36:04
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.57 kb
#include <fstream>
#include <deque>

using namespace std;
ifstream fin ("struti.in");
ofstream fout("struti.out");
int n, m, p, i, j, v[1002][1002], lmin[1002][1002], lmax[1002][1002],k, t, dy, dx,aux,nr;
deque<int> dmin, dmax;
int cmin[1002][1002],cmax[1002][1002],sol,maxi;

int main ()
{
    fin>>n>>m>>p;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            fin>>v[i][j];
    for(t=1;t<=2*p;t++)
    {
        if(t%2==1)
            fin>>dx>>dy;
        else
        {
            aux=dx;
            dx=dy;
            dy=aux;
            if(dx==dy)
            {
                fout<<maxi<<" "<<sol<<"\n";
                continue;
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                while(nr>0&&v[i][j]<=v[i][dmin[nr-1]])
                {
                    nr--;
                    dmin.pop_back();
                }
                nr++;
                dmin.push_back(j);
                if(dmin[0]<j-dy+1)
                {
                    dmin.pop_front();
                    nr--;
                }
                if(j>=dy)
                    lmin[i][j]=v[i][dmin[0]];
                while(k>0&&v[i][j]>=v[i][dmax[k-1]])
                {
                    k--;
                    dmax.pop_back();
                }
                k++;
                dmax.push_back(j);
                if(dmax[0]<j-dy+1)
                {
                    dmax.pop_front();
                    k--;
                }
                if(j>=dy)
                    lmax[i][j]=v[i][dmax[0]];
            }
            while(nr>0)
            {
                nr--;
                dmin.pop_front();
            }
            while(k>0)
            {
                k--;
                dmax.pop_front();
            }
        }
        for(j=dy;j<=m;j++)
        {
            for(i=1;i<=n;i++)
            {
                while(nr>0&&lmin[i][j]<=lmin[dmin[nr-1]][j])
                {
                    nr--;
                    dmin.pop_back();
                }
                nr++;
                dmin.push_back(i);
                if(dmin[0]<i-dx+1)
                {
                    dmin.pop_front();
                    nr--;
                }
                if(i>=dx)
                    cmin[i][j]=lmin[dmin[0]][j];
                while(k>0&&lmax[i][j]>=lmax[dmax[k-1]][j])
                {
                    k--;
                    dmax.pop_back();
                }
                k++;
                dmax.push_back(i);
                if(dmax[0]<i-dx+1)
                {
                    dmax.pop_front();
                    k--;
                }
                if(i>=dx)
                    cmax[i][j]=lmax[dmax[0]][j];
            }
            while(nr>0)
            {
                nr--;
                dmin.pop_front();
            }
            while(k>0)
            {
                k--;
                dmax.pop_front();
            }
        }
        if(t%2==1)
            maxi=10000;
        for(i=dx;i<=n;i++)
        {
            for(j=dy;j<=m;j++)
            {
                if(maxi>cmax[i][j]-cmin[i][j])
                {
                    maxi=cmax[i][j]-cmin[i][j];
                    sol=1;
                }
                else
                    if(maxi==cmax[i][j]-cmin[i][j])
                        sol++;
            }
        }
        if(t%2==0)
            fout<<maxi<<" "<<sol<<"\n";
    }
    fin.close();
    fout.close();
    return 0;
}