Cod sursa(job #1910408)

Utilizator Daria09Florea Daria Daria09 Data 7 martie 2017 16:47:59
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <iostream>
#include <fstream>
#define Nmax 1003
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int i,j,n,m,dx,dy,MIN,q,head,tail,t,aux,nr;
int dmax1[Nmax][Nmax],dmax2[Nmax][Nmax],dmin1[Nmax][Nmax],dmin2[Nmax][Nmax],dq[Nmax],a[Nmax][Nmax];
void read()
{
    int i,j;
    f>>n>>m>>q;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        f>>a[i][j];
}
void deque_Min1()
{
    for(i=1;i<=n;i++)
    {
        dq[1]=1; head=tail=1; t=0;
        for(j=2;j<=m;j++)
        {
            while(head<=tail&&a[i][j]<a[i][dq[tail]])tail--;
            tail++; dq[tail]=j;
            if(j-dq[head]==dy)head++;
            if(j>=dy)dmin1[i][++t]=a[i][dq[head]];
        }
    }
}
void deque_Min2()
{
    for(j=1;j<=m;j++)
    {
        dq[1]=1; head=tail=1; t=0;
        for(i=2;i<=n;i++)
        {
            while(head<=tail&&dmin1[i][j]<dmin1[dq[tail]][j])tail--;
            tail++; dq[tail]=i;
            if(i-dq[head]==dx)head++;
            if(i>=dx)dmin2[++t][j]=dmin1[dq[head]][j];
        }
    }
}
void deque_Max1()
{
    for(i=1;i<=n;i++)
    {
        dq[1]=1; head=tail=1; t=0;
        for(j=2;j<=m;j++)
        {
            while(head<=tail&&a[i][j]>a[i][dq[tail]])tail--;
            tail++; dq[tail]=j;
            if(j-dq[head]==dy)head++;
            if(j>=dy)dmax1[i][++t]=a[i][dq[head]];
        }
    }
}
void deque_Max2()
{
    for(j=1;j<=m;j++)
    {
        dq[1]=1; head=tail=1; t=0;
        for(i=2;i<=n;i++)
        {
            while(head<=tail&&dmax1[i][j]>dmax1[dq[tail]][j])tail--;
            tail++; dq[tail]=i;
            if(i-dq[head]==dx)head++;
            if(i>=dx)dmax2[++t][j]=dmax1[dq[head]][j];
        }
    }
}
void findsol()
{
    for(i=1;i<=n-dx+1;i++)
        for(j=1;j<=m-dy+1;j++)
        if(dmax2[i][j]-dmin2[i][j]<MIN){MIN=dmax2[i][j]-dmin2[i][j];nr=1;} else
        if(dmax2[i][j]-dmin2[i][j]==MIN)nr++;
}
void solve()
{
    int i;
    for(i=1;i<=q;i++)
    {
        f>>dx>>dy;
        MIN=8005; nr=0;
        deque_Min1();deque_Min2();
        deque_Max1();deque_Max2();
        findsol();
        if(dx!=dy)
        {
            aux=dx; dx=dy; dy=aux;
            deque_Min1();deque_Min2();
            deque_Max1();deque_Max2();
            findsol();
        }
        g<<MIN<<" "<<nr<<'\n';
    }
}
int main()
{
    read();
    solve();
    f.close();
    g.close();
    return 0;
}