Cod sursa(job #3306303)

Utilizator Tudor_CCTudor Cocu Tudor_CC Data 9 august 2025 14:10:28
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.41 kb
#include <bits/stdc++.h>

using namespace std;

int v[1005][1005];

int mn[1005][1005];
int mx[1005][1005];

deque <int> qn;

deque <int> qm;

int main()
{
    ifstream cin("struti.in");
    ofstream cout("struti.out");
    int n,m,t,x,y;
    cin>>n>>m>>t;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            cin>>v[i][j];
        }
    }
    for(int h=1;h<=t;++h)
    {
        cin>>x>>y;
        int min=INT_MAX,cnt=0;
        for(int j=1;j<=m;++j)
        {
            while(qn.size())
            {
                qn.pop_front(); ///min
            }
            while(qm.size())
            {
                qm.pop_front();  ///max
            }
            for(int i=1;i<=n;++i)
            {
                while(qn.size()>0 && qn.front()<(i-x+1))
                {
                    qn.pop_front();
                }
                while(qn.size()>0 && v[qn.back()][j]>=v[i][j])
                {
                    qn.pop_back();
                }
                qn.push_back(i);

                while(qm.size()>0 && qm.front()<(i-x+1))
                {
                    qm.pop_front();
                }
                while(qm.size()>0 && v[qm.back()][j]<=v[i][j])
                {
                    qm.pop_back();
                }
                qm.push_back(i);
                mn[i][j]=v[qn.front()][j];
                mx[i][j]=v[qm.front()][j];
            }
        }
        for(int i=x;i<=n;++i)
        {
            while(qn.size())
            {
                qn.pop_front(); ///min
            }
            while(qm.size())
            {
                qm.pop_front();  ///max
            }
            for(int j=1;j<=m;++j)
            {
                while(qn.size()>0 && qn.front()<(j-y+1))
                {
                    qn.pop_front();
                }
                while(qn.size()>0 && mn[i][qn.back()]>=mn[i][j])
                {
                    qn.pop_back();
                }
                qn.push_back(j);
                while(qm.size()>0 && qm.front()<(j-y+1))
                {
                    qm.pop_front();
                }
                while(qm.size()>0 && mx[i][qm.back()]<=mx[i][j])
                {
                    qm.pop_back();
                }
                qm.push_back(j);
                if(j>=y)
                {
                    //cout<<i<<" "<<j<<" "<<mx[i][qm.front()]<<" "<<mn[i][qn.front()]<<"\n";
                    if(mx[i][qm.front()]-mn[i][qn.front()]<min)
                    {
                        min=mx[i][qm.front()]-mn[i][qn.front()];
                        cnt=0;
                    }
                    if(mx[i][qm.front()]-mn[i][qn.front()]==min)
                    {
                        ++cnt;
                    }
                }
            }
        }

        if(x!=y)
        {

        swap(x,y);
        for(int j=1;j<=m;++j)
        {
            while(qn.size())
            {
                qn.pop_front(); ///min
            }
            while(qm.size())
            {
                qm.pop_front();  ///max
            }
            for(int i=1;i<=n;++i)
            {
                while(qn.size()>0 && qn.front()<(i-x+1))
                {
                    qn.pop_front();
                }
                while(qn.size()>0 && v[qn.back()][j]>=v[i][j])
                {
                    qn.pop_back();
                }
                qn.push_back(i);

                while(qm.size()>0 && qm.front()<(i-x+1))
                {
                    qm.pop_front();
                }
                while(qm.size()>0 && v[qm.back()][j]<=v[i][j])
                {
                    qm.pop_back();
                }
                qm.push_back(i);
                mn[i][j]=v[qn.front()][j];
                mx[i][j]=v[qm.front()][j];
            }
        }
        for(int i=x;i<=n;++i)
        {
            while(qn.size())
            {
                qn.pop_front(); ///min
            }
            while(qm.size())
            {
                qm.pop_front();  ///max
            }
            for(int j=1;j<=m;++j)
            {
                while(qn.size()>0 && qn.front()<(j-y+1))
                {
                    qn.pop_front();
                }
                while(qn.size()>0 && mn[i][qn.back()]>=mn[i][j])
                {
                    qn.pop_back();
                }
                qn.push_back(j);

                while(qm.size()>0 && qm.front()<(j-y+1))
                {
                    qm.pop_front();
                }
                while(qm.size()>0 && mx[i][qm.back()]<=mx[i][j])
                {
                    qm.pop_back();
                }
                qm.push_back(j);
                if(j>=y)
                {
                   // cout<<i<<" "<<j<<" "<<mx[i][qm.front()]<<" "<<mn[i][qn.front()]<<"\n";
                    if(mx[i][qm.front()]-mn[i][qn.front()]<min)
                    {
                        min=mx[i][qm.front()]-mn[i][qn.front()];
                        cnt=0;
                    }
                    if(mx[i][qm.front()]-mn[i][qn.front()]==min)
                    {
                        ++cnt;
                    }
                }
            }
        }
        }
        cout<<min<<" "<<cnt<<"\n";
    }
    return 0;
}