Cod sursa(job #2065175)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 13 noiembrie 2017 15:28:30
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
struct matrix
{
    int val,minval,maxval,dif;
}a[1002][1002];
int deqmin[1001],deqmax[1001];
int n,m;
struct rez
{
    int val,nr;
}mindif;
void verif(int l,int c)
{
    int i,j,pmin,umin,pmax,umax;
    for(j=1; j<=m; j++)
    {
        pmin=pmax=1;
        umin=umax=0;
        for(i=1; i<=l; i++)
        {
            while(umax>0 && a[deqmax[umax]][j].val<=a[i][j].val)
                umax--;
            while(umin>0 && a[deqmin[umin]][j].val>=a[i][j].val)
                umin--;
            deqmax[++umax]=i;
            deqmin[++umin]=i;
        }
        a[l][j].minval=a[deqmin[1]][j].val;
        a[l][j].maxval=a[deqmax[1]][j].val;
        for(; i<=n; i++)
        {
            while(pmin<=umin && deqmin[pmin]<=i-l)
                pmin++;
            while(pmax<=umax && deqmax[pmax]<=i-l)
                pmax++;
            while(umax>=pmax && a[deqmax[umax]][j].val<=a[i][j].val)
                umax--;
            while(umin>=pmin && a[deqmin[umin]][j].val>=a[i][j].val)
                umin--;
            deqmax[++umax]=i;
            deqmin[++umin]=i;
            a[i][j].minval=a[deqmin[pmin]][j].val;
            a[i][j].maxval=a[deqmax[pmax]][j].val;
        }
    }
    for(i=l; i<=n; i++)
    {
        pmin=pmax=1;
        umin=umax=0;
        for(j=1; j<=c; j++)
        {
            while(umax>0 && a[i][deqmax[umax]].maxval<=a[i][j].maxval)
                umax--;
            while(umin>0 && a[i][deqmin[umin]].minval>=a[i][j].minval)
                umin--;
            deqmax[++umax]=j;
            deqmin[++umin]=j;
        }
        a[i][c].dif=a[i][deqmax[pmax]].maxval-a[i][deqmin[pmin]].minval;
        for(; j<=m; j++)
        {
            while(pmin<=umin && deqmin[pmin]<=j-c)
                pmin++;
            while(pmax<=umax && deqmax[pmax]<=j-c)
                pmax++;
            while(umax>=pmax && a[i][deqmax[umax]].maxval<=a[i][j].maxval)
                umax--;
            while(umin>=pmin && a[i][deqmin[umin]].minval>=a[i][j].minval)
                umin--;
            deqmax[++umax]=j;
            deqmin[++umin]=j;
            a[i][j].dif=a[i][deqmax[pmax]].maxval-a[i][deqmin[pmin]].minval;
        }
    }
    for(i=l; i<=n; i++)
        for(j=c; j<=m; j++)
            if(a[i][j].dif<mindif.val)
                mindif.val=a[i][j].dif,mindif.nr=1;
            else
                if(a[i][j].dif==mindif.val)
                    mindif.nr++;

}
int main()
{
    int p,i,j,k,x,y;
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d%d%d",&n,&m,&p);
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            scanf("%d",&a[i][j]);
    for(k=1; k<=p; k++)
    {
        scanf("%d%d",&x,&y);
        mindif.val=8001;
        mindif.nr=0;
        verif(x,y);
        if(x!=y) verif(y,x);
        printf("%d %d\n",mindif.val,mindif.nr);
    }

    return 0;
}