Cod sursa(job #2059056)

Utilizator sabinantonSabin Anton sabinanton Data 6 noiembrie 2017 16:50:27
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int n,m,a[101][101],mn[101][101],mx[101][101];
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,maxim=100000;
    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) maxim = min(maxim,mx[i][dmax[stmax]]-mn[i][dmin[stmin]]);
        }
    }
    return maxim;
}
int main()
{
    int i,j,x,y,p,rez=100000;
    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;
        dqv(x);
        rez=min(rez,dqo(x,y));
        dqv(y);
        rez=min(rez,dqo(x,y));
        fout<<rez<<endl;
    }
    return 0;
}