Cod sursa(job #2059197)

Utilizator sabinantonSabin Anton sabinanton Data 6 noiembrie 2017 19:23:56
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int n,m,a[1001][1001],mn[1001][1001],mx[1001][1001],ap;
int dmax[1000001],dmin[10000001];

void dqv(int x)
{
    int i,j,h,MX;
    for(j=1; j<=m; j++)
    {
        int drmax=-1,stmax=0,drmin=-1,stmin=0;
        for(i=1; i<=n; i++)
        {
            if(stmax<=drmax && dmax[stmax]==i-x) stmax++;
            while(stmax<=drmax&&a[i][j]>=a[dmax[drmax]][j])drmax--;
            dmax[++drmax]=i;
            mx[i][j]=a[dmax[stmax]][j];
        }
        for(i=1; i<=n; i++)
        {
            if(stmin<=drmin && dmin[stmin]==i-x) stmin++;
            while(stmin<=drmin&&a[i][j]<=a[dmin[drmin]][j])drmin--;
            dmin[++drmin]=i;
            mn[i][j]=a[dmin[stmin]][j];
        }
    }
}

int dqo(int x, int y)
{
    int i,j,minim=100000;
    dqv(x);
    for(int i=x;i<=n;i++)
    {
        int drmax=-1,stmax=0,drmin=-1,stmin=0;
        for(j=1;j<=m;j++)
        {
            if(stmax<=drmax && dmax[stmax] == j-y) stmax++;
            if(stmin<=drmin && dmin[stmin] == j-y) stmin++;
            while(stmax<=drmax && mx[i][j] >= mx[i][dmax[drmax]]) drmax--;
            while(stmin<=drmin && mn[i][j] <= mn[i][dmin[drmin]]) drmin--;
            dmax[++drmax]=j;
            dmin[++drmin]=j;
            if (j >= y)
            {
                if(minim>mx[i][dmax[stmax]]-mn[i][dmin[stmin]])
                {
                    minim=mx[i][dmax[stmax]]-mn[i][dmin[stmin]];ap=1;
                }
                else if(minim==mx[i][dmax[stmax]]-mn[i][dmin[stmin]])ap++;
            }
        }
    }
    if(x!=y)
    {
        dqv(y);
    for(int i=y;i<=n;i++)
    {
        int drmax=-1,stmax=0,drmin=-1,stmin=0;
        for(j=1;j<=m;j++)
        {
            if(stmax<=drmax && dmax[stmax] == j-x) stmax++;
            if(stmin<=drmin && dmin[stmin] == j-x) stmin++;
            while(stmax<=drmax && mx[i][j] >= mx[i][dmax[drmax]]) drmax--;
            while(stmin<=drmin && mn[i][j] <= mn[i][dmin[drmin]]) drmin--;
            dmax[++drmax]=j;
            dmin[++drmin]=j;
            if (j >= x)
            {
                if(minim>mx[i][dmax[stmax]]-mn[i][dmin[stmin]])
                {
                    minim=mx[i][dmax[stmax]]-mn[i][dmin[stmin]];ap=1;
                }
                else if(minim==mx[i][dmax[stmax]]-mn[i][dmin[stmin]])ap++;
            }
        }
    }
    }
    return minim;
}
int main()
{
    int i,j,x,y,p,rez=100000,ap1,ap2,rez1;
    fin>>n>>m>>p;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            fin>>a[i][j];
        }
    }
    for(i=1; i<=p; i++)
    {
        fin>>x>>y;
        ap=1;
        rez=dqo(x,y);
        fout<<rez<<" "<<ap<<'\n';
    }
    return 0;
}