Cod sursa(job #2426782)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 29 mai 2019 11:35:18
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.05 kb
#include <bits/stdc++.h>
#include <cmath>

using namespace std;

ifstream f("struti.in");
ofstream g("struti.out");

int v[1001][1001],deq[1001],n,m,i,j,minim[1001][1001],maxim[1001][1001],deqc[1001][1001],x,y,q,sol,afis;

int main()
{
f>>n>>m>>q;
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        f>>v[i][j];
    }
}
int p=1;
int u=0;
for(int z=1;z<=q;z++){
f>>x>>y;
sol=999999999;
afis=0;
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        minim[i][j]=0;
        maxim[i][j]=0;
        deqc[i][j];
    }
}
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        while(p<=u&&v[i][j]>v[i][deq[u]])
        {
            u--;
        }
        u++;
        deq[u]=j;
        if(j-y>=deq[p])
        {
            p++;
        }
        if(j>=y)
        {
            deqc[i][j-y+1]=v[i][deq[p]];
        }
    }
    p=1;
    u=0;

}
p=1;
u=0;
for(j=1;j<=m;j++)
{
    for(i=1;i<=n;i++)
    {
        while(p<=u&&deqc[deq[u]][j]<deqc[i][j])
        {
            u--;
        }
        u++;
        deq[u]=i;
        if(i-x>=deq[p]) p++;
        if(i>=x)
        {
            maxim[i-x+1][j]=deqc[deq[p]][j];
        }


    }
    p=1;
    u=0;
}
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        deqc[i][j]=0;
    }
}
p=1;
u=0;
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        while(p<=u&&v[i][j]<v[i][deq[u]])
        {
            u--;
        }
        u++;
        deq[u]=j;
        if(j-y>=deq[p])
        {
            p++;
        }
        if(j>=y)
        {
            deqc[i][j-y+1]=v[i][deq[p]];
        }
    }
    p=1;
    u=0;

}
p=1;
u=0;
for(j=1;j<=m;j++)
{
    for(i=1;i<=n;i++)
    {
        while(p<=u&&deqc[deq[u]][j]>deqc[i][j])
        {
            u--;
        }
        u++;
        deq[u]=i;
        if(i-x>=deq[p]) p++;
        if(i>=x)
        {
            minim[i-x+1][j]=deqc[deq[p]][j];
        }


    }
    p=1;
    u=0;
}
for(i=1;i<=n-x+1;i++)
{
    for(j=1;j<=m-y+1;j++)
    {if(maxim[i][j]-minim[i][j]==sol) afis++;
        if(maxim[i][j]-minim[i][j]<sol)
        {
            sol=maxim[i][j]-minim[i][j];
            afis=1;
        }

    }
}
if(x!=y){
swap(x,y);
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        minim[i][j]=0;
        maxim[i][j]=0;
        deqc[i][j];
    }
}
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        while(p<=u&&v[i][j]>v[i][deq[u]])
        {
            u--;
        }
        u++;
        deq[u]=j;
        if(j-y>=deq[p])
        {
            p++;
        }
        if(j>=y)
        {
            deqc[i][j-y+1]=v[i][deq[p]];
        }
    }
    p=1;
    u=0;

}
p=1;
u=0;
for(j=1;j<=m;j++)
{
    for(i=1;i<=n;i++)
    {
        while(p<=u&&deqc[deq[u]][j]<deqc[i][j])
        {
            u--;
        }
        u++;
        deq[u]=i;
        if(i-x>=deq[p]) p++;
        if(i>=x)
        {
            maxim[i-x+1][j]=deqc[deq[p]][j];
        }


    }
    p=1;
    u=0;
}
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        deqc[i][j]=0;
    }
}
p=1;
u=0;
for(i=1;i<=n;i++)
{
    for(j=1;j<=m;j++)
    {
        while(p<=u&&v[i][j]<v[i][deq[u]])
        {
            u--;
        }
        u++;
        deq[u]=j;
        if(j-y>=deq[p])
        {
            p++;
        }
        if(j>=y)
        {
            deqc[i][j-y+1]=v[i][deq[p]];
        }
    }
    p=1;
    u=0;

}
p=1;
u=0;
for(j=1;j<=m;j++)
{
    for(i=1;i<=n;i++)
    {
        while(p<=u&&deqc[deq[u]][j]>deqc[i][j])
        {
            u--;
        }
        u++;
        deq[u]=i;
        if(i-x>=deq[p]) p++;
        if(i>=x)
        {
            minim[i-x+1][j]=deqc[deq[p]][j];
        }


    }
    p=1;
    u=0;
}
for(i=1;i<=n-x+1;i++)
{
    for(j=1;j<=m-y+1;j++)
    {if(maxim[i][j]-minim[i][j]==sol) afis++;
        if(maxim[i][j]-minim[i][j]<sol)
        {
            sol=maxim[i][j]-minim[i][j];
            afis=1;
        }

    }
}
}
g<<sol<<" "<<afis<<'\n';
}


}