Cod sursa(job #2039620)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 14 octombrie 2017 18:23:45
Problema Struti Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <climits>

using namespace std;
int n,m,p,lx,ly,r,mn;
int x;
pair<int, int> ma[1005][1005];
bool cmp(pair<short, short> a, pair<short, short> b)
{
    return a.first<b.first;
}
void solve(int dx, int dy)
{
    int ll,lc;
    int lmn,lmx,lp,lm;
    for(int j=0; j<n-dx+1; ++j)
    {
        lm=j+dx-1;
        for(int li=0; li<m; ++li)
        {
            for(int lj=0; lj<n; ++lj)
            {
                lp=ma[li][lj].second;
                if(j<=lp && lp<=lm)
                {
                    ma[li][n]={ma[li][lj].first,-1};
                    break;
                }
            }
            for(int lj=n-1; lj>=0; --lj)
            {
                lp=ma[li][lj].second;
                if(j<=lp && lp<=lm)
                {
                    ma[li][n+1]={ma[li][lj].first,-1};
                    break;
                }
            }
        }
        for(int i=0; i<m-dy+1; ++i)
        {
            lmn=INT_MAX;
            lmx=INT_MIN;
            ll=i+dy-1;
            for(int li=i;li<=ll;++li)
            {
                lmn=min(lmn,ma[li][n].first);
                lmx=max(lmx,ma[li][n+1].first);
            }
            if(lmx-lmn<mn)
            {
                r=1;
                mn=lmx-lmn;
            }
            else if(lmx-lmn==mn)
                r++;
        }
    }
}
int main()
{
    freopen("struti.in","r",stdin);
    freopen("struti.out","w",stdout);
    scanf("%d %d %d", &m, &n, &p);
    for(int i=0; i<m; ++i)
    {
        scanf("\n%d", &x);
        ma[i][0]= {x,0};
        for(int j=1; j<n; ++j)
        {
            scanf(" %d", &x);
            ma[i][j]= {x,j};
        }
        sort(ma[i],ma[i]+n,cmp);
    }
    for(int i=0; i<p; ++i)
    {
        scanf("\n%d %d", &lx,&ly);
        r=0;
        mn=INT_MAX;
        if(lx!=ly)
        {
            solve(lx,ly);
            solve(ly,lx);
        }
        else
            solve(lx,ly);
        cout<<mn<<" "<<r<<"\n";
    }
    return 0;
}