Cod sursa(job #3179259)

Utilizator amunnumeVlad Patrascu amunnume Data 3 decembrie 2023 14:08:07
Problema Struti Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>
#define N 1005
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
int v[N][N],E[N],n,m,q,i,j,mn,mx,w,h,t;
int d[10][N][N],f[10][N][N],l[N][N],k[N][N];
void solve(int w,int h)
{
    int y,e;
    //fout<<23.0*sizeof(v)/1024.0/1024.0<<'\n';
    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    {
        d[0][i][j]=v[i][j];
        f[0][i][j]=v[i][j];
    }
    for(e=1;(1<<e)<=m;e++)
    {
        for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
        {
            d[e][i][j]=d[e-1][i][j];
            if(j+(1<<(e-1))<=m) d[e][i][j]=max(d[e][i][j],d[e-1][i][j+(1<<(e-1))]);

            f[e][i][j]=f[e-1][i][j];
            if(j+(1<<(e-1))<=m) f[e][i][j]=min(f[e][i][j],f[e-1][i][j+(1<<(e-1))]);
        }
    }
    for(i=1;i<=n;++i)
    for(j=1;j+w-1<=m;++j)
    {
        y=E[w];
        l[i][j]=max(d[y][i][j],d[y][i][j+w-(1<<y)]);
        k[i][j]=min(f[y][i][j],f[y][i][j+w-(1<<y)]);
    }
    for(i=1;i<=n;++i)
    for(j=1;j+w-1<=m;++j)
    {
        d[0][i][j]=l[i][j];
        f[0][i][j]=k[i][j];
    }
    for(e=1;(1<<e)<=n;++e)
    {
        for(j=1;j+w-1<=m;++j)
        for(i=1;i<=n;++i)
        {
            d[e][i][j]=d[e-1][i][j];
            if(i+(1<<(e-1))<=m) d[e][i][j]=max(d[e][i][j],d[e-1][i+(1<<(e-1))][j]);

            f[e][i][j]=f[e-1][i][j];
            if(i+(1<<(e-1))<=m) f[e][i][j]=min(f[e][i][j],f[e-1][i+(1<<(e-1))][j]);
        }
    }
    for(i=1;i+h-1<=n;++i)
    for(j=1;j+w-1<=m;++j)
    {
        int a,b;
        y=E[h];
        a=max(d[y][i][j],d[y][i+h-(1<<y)][j]);
        b=min(f[y][i][j],f[y][i+h-(1<<y)][j]);
        if(a-b<mn)
        {
            mn=a-b;
            t=1;
        }
        else if(a-b==mn) ++t;
    }
}
int main()
{
    for(i=2;i<=1000;++i)
    {
        E[i]=1+E[i>>1];
    }
    fin>>n>>m>>q;
    for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    {
        fin>>v[i][j];
    }
    while(q--)
    {
        fin>>w>>h;
        mn=2e9; t=0;
        solve(w,h);
        if(h!=w) solve(h,w);
        fout<<mn<<' '<<t<<'\n';
    }
    return 0;
}