Cod sursa(job #2573546)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 5 martie 2020 18:06:37
Problema Struti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.53 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 x1=i,x2=i+x-1,y1=j,y2=j+y-1;
    int difr=log2(x2-x1+1),difc=log2(y2-y1+1);

    int maxim1,maxim2,minim1,minim2;
    maxim1=max(rmq[difr][difc][x1][y1].maxi,rmq[difr][difc][x2-(1<<difr)+1][y1].maxi);
    maxim2=max(rmq[difr][difc][x1][y2-(1<<difc)+1].maxi,
    rmq[difr][difc][x2-(1<<difr)+1][y2-(1<<difc)+1].maxi);

    minim1=max(rmq[difr][difc][x1][y1].mini,rmq[difr][difc][x2-(1<<difr)+1][y1].mini);
    minim2=max(rmq[difr][difc][x1][y2-(1<<difc)+1].mini,
    rmq[difr][difc][x2-(1<<difr)+1][y2-(1<<difc)+1].mini);

    maxim=max(maxim1,maxim2);
    minim=min(minim1,minim2);



}

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];

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

        for(int jc=1;jc<=dimM;jc++)
        for(int j=1;j+(1<<jc)-1<=M;j++)
        {
        rmq[0][jc][i][j].mini=min(rmq[0][jc-1][i][j].mini,rmq[0][jc-1][i][j+(1<<(jc-1))].mini);
        rmq[0][jc][i][j].maxi=max(rmq[0][jc-1][i][j].maxi,rmq[0][jc-1][i][j+(1<<(jc-1))].maxi);
        }
    }

    for(int jr=1;jr<=dimN;jr++)
    for(int i=1;i+(1<<jr)-1<=N;i++)
    for(int jc=0;jc<=dimM;jc++)
    for(int j=1;j+(1<<jc)-1<=M;j++)
    {
    rmq[jr][jc][i][j].mini=min(rmq[jr-1][jc][i][j].mini,rmq[jr-1][jc][i+(1<<(jr-1))][j].mini);
    rmq[jr][jc][i][j].maxi=max(rmq[jr-1][jc][i][j].maxi,rmq[jr-1][jc][i+(1<<(jr-1))][j].maxi);
    }

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


        int ans=9000,cnt=0;
        for(int i=1;i+x-1<=N;i++)
        for(int j=1;j+y-1<=M;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=1;i+x-1<=N;i++)
        for(int j=1;j+y-1<=M;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;
}