Cod sursa(job #1598632)

Utilizator touristGennady Korotkevich tourist Data 13 februarie 2016 03:30:46
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define INF 1000000000
#define Nmax 1005

using namespace std;

int a[Nmax][Nmax],n,m;
int LMaxx[Nmax][Nmax],LMinn[Nmax][Nmax],sol,cnt;
deque <int> Q1,Q2;

inline void Solve(int DX, int DY)
{
    int i,j;
    for(i=1;i<=n;++i)
    {
        Q1.clear(); Q2.clear();
        for(j=1;j<=m;++j)
        {
            while(!Q1.empty() && Q1.front()<=j-DY) Q1.pop_front();
            while(!Q2.empty() && Q2.front()<=j-DY) Q2.pop_front();

            while(!Q1.empty() && a[i][Q1.back()]<a[i][j]) Q1.pop_back();
            Q1.push_back(j);
            while(!Q2.empty() && a[i][Q2.back()]>a[i][j]) Q2.pop_back();
            Q2.push_back(j);
            if(j>=DY) LMaxx[i][j]=a[i][Q1.front()];
            if(j>=DY) LMinn[i][j]=a[i][Q2.front()];
        }
    }

    for(j=DY;j<=m;++j)
    {
        Q1.clear(); Q2.clear();
        for(i=1;i<=n;++i)
        {
            while(!Q1.empty() && Q1.front()<=i-DX) Q1.pop_front();
            while(!Q2.empty() && Q2.front()<=i-DX) Q2.pop_front();

            while(!Q1.empty() && LMaxx[Q1.back()][j]<LMaxx[i][j]) Q1.pop_back();
            Q1.push_back(i);
            while(!Q2.empty() && LMinn[Q2.back()][j]>LMinn[i][j]) Q2.pop_back();
            Q2.push_back(i);

            if(i>=DX)
            {
                int val=LMaxx[Q1.front()][j]-LMinn[Q2.front()][j];
                if(sol>val)
                {
                    sol=val; cnt=1;
                }
                else
                    if(sol==val) ++cnt;
            }
        }
    }
}

int main()
{
    int Q,Dx,Dy,i,j;
    ifstream cin("struti.in");
    ofstream cout("struti.out");
    cin>>n>>m>>Q;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j) cin>>a[i][j];
    while(Q--)
    {
        cin>>Dx>>Dy;
        sol=INF;
        Solve(Dx,Dy);
        if(Dx!=Dy) Solve(Dy,Dx);
        cout<<sol<<" "<<cnt<<"\n";
    }
    return 0;
}