Cod sursa(job #2067415)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 16 noiembrie 2017 13:09:46
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.17 kb
#include <cstdio>
#include <deque>
#define DIMBUFF 100000

using namespace std;
FILE * fin = fopen ("struti.in", "r");
FILE *fout = fopen ("struti.out", "w");
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;
char buff[DIMBUFF];
int pp;


int numar() {
    int val = 0;
    while (!(buff[pp] >= '0' && buff[pp] <= '9')) {
        pp++;
        if (pp == DIMBUFF) {
            fread(buff, 1, DIMBUFF, fin);
            pp=0;
        }
    }
    while (buff[pp] >= '0' && buff[pp] <= '9') {
        val = val*10 + buff[pp] - '0';
        pp++;
        if (pp == DIMBUFF) {
            fread(buff, 1, DIMBUFF, fin);
            pp=0;
        }
    }
    return val;
}


int main ()
{
    fread(buff, 1, DIMBUFF, fin);
    n=numar();
    m=numar();
    p=numar();
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            v[i][j]=numar();
    for(t=1;t<=2*p;t++)
    {
        if(t%2==1)
        {
            dx=numar();
            dy=numar();
        }
        else
        {
            aux=dx;
            dx=dy;
            dy=aux;
            if(dx==dy)
            {
                fprintf (fout,"%d %d\n",maxi,sol);
                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)
            fprintf (fout,"%d %d\n",maxi,sol);
    }
    return 0;
}