Cod sursa(job #2573432)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 5 martie 2020 17:37:11
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <bits/stdc++.h>
#define Dim 1001
using namespace std;
ifstream f("struti.in");
ofstream g("struti.out");
int N,M,P,A[Dim][Dim],maxim,minim;

struct info
{
    int mini,maxi;
}rmq[12][12][Dim][Dim];

int Solve(int i,int j,int x,int y)
{
    int difi=log2(x),difj=log2(y);


    maxim=max (max(rmq[difi][difj][i][j].maxi,rmq[difi][difj][i][j-y+(1<<difj)].maxi),
              max(rmq[difi][difj][i-x+(1<<difi)][j].maxi,
              rmq[difi][difj][i-x+(1<<difi)][j-y+(1<<difj)].maxi));

    minim=min(min(rmq[difi][difj][i][j].mini,rmq[difi][difj][i][j-y+(1<<difj)].mini),
              min(rmq[difi][difj][i-x+(1<<difi)][j].mini,
              rmq[difi][difj][i-x+(1<<difi)][j-y+(1<<difj)].mini));

            //cout<<difi<<' '<<difj<<' '<<x<<' '<<y<<' '<<i<<' '<<j<<' '<<maxim<<' '<<minim<<'\n';


}

int main()
{
    int x,y;
    f>>N>>M>>P;

        int dimN=log2(N),dimM=log2(M);

    for(int i=1;i<=N;i++)
    for(int j=1;j<=M;j++)
    {
        f>>A[i][j];
        rmq[0][0][i][j]={A[i][j],A[i][j]};
    }

    for(int i=1;i<=N;i++)
    for(int j=2;j<=M;j++)
        rmq[0][1][i][j]={min(A[i][j-1],A[i][j]),max(A[i][j-1],A[i][j])};

    for(int i=N;i>1;i--)
    for(int j=1;j<=M;j++)
    rmq[1][0][i][j]={min(A[i][j],A[i-1][j]),max(A[i][j],A[i-1][j])};

    for(int li=1;li<=dimN;li++)
    for(int lj=1;lj<=dimM;lj++)
    for(int i=N;i - ( 1<<li ) +1 > 0;i--)
    for(int j=M;j - ( 1<<lj ) + 1 >0  ;j--)
    {
        rmq[li][lj][i][j].mini=min(
        min(rmq[li-1][lj-1][i][j].mini,rmq[li-1][lj-1][i][j-(1<<(lj-1))].mini),
            min(rmq[li-1][lj-1][i-(1<<(li-1))][j].mini,
            rmq[li-1][lj-1][i-(1<<(li-1))][j-(1<<(lj-1))].mini));

        rmq[li][lj][i][j].maxi=max(
        max(rmq[li-1][lj-1][i][j].maxi,rmq[li-1][lj-1][i][j-(1<<(lj-1))].maxi),
            max(rmq[li-1][lj-1][i-(1<<(li-1))][j].maxi,
            rmq[li-1][lj-1][i-(1<<(li-1))][j-(1<<(lj-1))].maxi));
   // cout<<li<<' '<<lj<<' '<<i<<' '<<j<<' '<<rmq[li][lj][i][j].mini<<' '<<rmq[li][lj][i][j].maxi<<'\n';

    }

    for(int i=1;i<=P;i++)
    {
        f>>x>>y;


        int ans=9000,cnt=0;
        for(int i=x;i<=N;i++)
        for(int j=y;j<=N;j++)
        {
            Solve(i,j,x,y);

            if(maxim-minim < ans)
            {
                ans=maxim-minim;
                cnt=1;
            }
            else
            if(maxim-minim==ans) cnt++;
        }

        if(x!=y)
        {
        for(int i=y;i<=N;i++)
        for(int j=x;j<=N;j++)
        {
            Solve(i,j,x,y);
            if(maxim-minim < ans)
            {
                ans=maxim-minim;
                cnt=1;
            }
            else
            if(maxim-minim==ans) cnt++;
        }

        }
        g<<ans<<' '<<cnt<<'\n';
    }


    return 0;
}