Cod sursa(job #1772204)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 6 octombrie 2016 16:08:59
Problema Struti Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.13 kb
#include <bits/stdc++.h>
#define Nmax 1005

using namespace std;

int n, m, a[Nmax][Nmax];
deque<int> qmin[Nmax], qmax[Nmax];
deque<pair <int , int> > dmin, dmax;

void Rezolv(int dx, int dy, int &difmin, int &cnt)
{
    int L, C, x, i, j;
    L = dx;
    C = dy;
    for(j = 1; j <= C; j++)
    {
        for(i = 1; i <= n; i++)
        {
            x = a[i][j];
            while(!qmax[i].empty() && x >= a[i][qmax[i].back()])
                qmax[i].pop_back();
            qmax[i].push_back(j);
            while(!qmin[i].empty() && x <= a[i][qmin[i].back()])
                qmin[i].pop_back();
            qmin[i].push_back(j);
        }
    }
    for(i = 1; i <= L; i++)
    {
        x = a[i][qmax[i].front()];
        while(!dmax.empty() && x >= dmax.back().second)
            dmax.pop_back();
        dmax.push_back(make_pair(i, x));
        x = a[i][qmin[i].front()];
        while(!dmin.empty() && x <= dmin.back().second)
            dmin.pop_back();
        dmin.push_back(make_pair(i, x));
    }
    difmin = dmax.front().second - dmin.front().second;
    cnt = 1;
    for(i = L + 1; i <= n; i++)
    {
        x = a[i][qmax[i].front()];
        while(!dmax.empty() && x >= dmax.back().second)
            dmax.pop_back();
        dmax.push_back(make_pair(i, x));
        x = a[i][qmin[i].front()];
        while(!dmin.empty() && x <= dmin.back().second)
            dmin.pop_back();
        dmin.push_back(make_pair(i, x));
        if(i - dmax.front().first >= L)
            dmax.pop_front();
        if(i - dmin.front().first >= L)
            dmin.pop_front();
        x = dmax.front().second - dmin.front().second;
        if(difmin > x)
        {
            difmin = x;
            cnt = 1;
        }
        else if(difmin == x)
            cnt++;
    }
    for(j = C + 1; j <= m; j++)
    {
        for(i = 1; i <= n; i++)
        {
            x = a[i][j];
            while(!qmax[i].empty() && x >= a[i][qmax[i].back()])
                qmax[i].pop_back();
            qmax[i].push_back(j);
            if(j - qmax[i].front() >= C)
                qmax[i].pop_front();
            while(!qmin[i].empty() && x <= a[i][qmin[i].back()])
                qmin[i].pop_back();
            qmin[i].push_back(j);
            if(j - qmin[i].front() >= C)
                qmin[i].pop_front();
        }
        dmax.clear();
        dmin.clear();
        for(i = 1; i <= L; i++)
        {
            x = a[i][qmax[i].front()];
            while(!dmax.empty() && x >= dmax.back().second)
                dmax.pop_back();
            dmax.push_back(make_pair(i, x));
            x = a[i][qmin[i].front()];
            while(!dmin.empty() && x <= dmin.back().second)
                dmin.pop_back();
            dmin.push_back(make_pair(i, x));
        }
        for(i = L + 1; i <= n; i++)
        {
            x = a[i][qmax[i].front()];
            while(!dmax.empty() && x >= dmax.back().second)
                dmax.pop_back();
            dmax.push_back(make_pair(i, x));
            x = a[i][qmin[i].front()];
            while(!dmin.empty() && x <= dmin.back().second)
                dmin.pop_back();
            dmin.push_back(make_pair(i, x));
            if(i - dmax.front().first >= L)
                dmax.pop_front();
            if(i - dmin.front().first >= L)
                dmin.pop_front();
            x = dmax.front().second - dmin.front().second;
            cout << dmax.front().second << " " << dmin.front().second << "\n";
            if(difmin > x)
            {
                difmin = x;
                cnt = 1;
            }
            else if(difmin == x)
                cnt++;
        }
    }


}

void Citire()
{
    ifstream f("struti.in");
    ofstream g("struti.out");
    int i, j, p, dx, dy, difmin, cnt;
    f >> n >> m >> p;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= m; j++)
            f >> a[i][j];
    for(i = 1; i <= p; i++)
    {
        f >> dx >> dy;
        Rezolv(dx, dy, difmin, cnt);
        g << difmin << " " << cnt << "\n";
    }
    f.close();
    g.close();
}

int main()
{
    Citire();
    return 0;
}