Cod sursa(job #2430277)

Utilizator bluestorm57Vasile T bluestorm57 Data 13 iunie 2019 18:51:40
Problema Struti Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.18 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("struti.in");
ofstream g("struti.out");

const int NMAX = 1005;
const int inf = 2e9;
int mat[NMAX][NMAX],n,m,p,ansdif,ansnumber;//,sup[NMAX][NMAX];
deque < int> d,q;
vector <int> vmax[NMAX],vmin[NMAX], supmin[NMAX], supmax[NMAX];

void solve(int x, int y){
    int i,j;
    for(i = 1 ; i <= n ; i++){
        for(j = 1 ; j <= m ; j++){
            while(!d.empty() && mat[i][j] <= mat[i][d.back()])
                d.pop_back();
            d.push_back(j);
            if(d.front() == j - y)
                d.pop_front();
            if(j >= y)
                vmin[i].push_back(mat[i][d.front()]);

            while(!q.empty() && mat[i][j] >= mat[i][q.back()])
                q.pop_back();
            q.push_back(j);
            if(q.front() == j - y)
                q.pop_front();
            if(j >= y)
                vmax[i].push_back(mat[i][q.front()]);

        }
        while(!q.empty())
            q.pop_back();
        while(!d.empty())
            d.pop_back();
    }

    /*for(i = 1 ; i <= n ; i++){
        for(j = 0 ; j < vmin[i].size() ; j++)
            g << vmin[i][j] << " ";
        g << "\n";
    }g << "\n";*/

    for(j = 0 ; j < vmin[1].size() ; j++){
        for(i = 1 ; i <= n ; i++){
            while(!d.empty() && vmin[i][j] <= vmin[d.back()][j])
                d.pop_back();
            d.push_back(i);
            if(d.front() == i - x)
                d.pop_front();
            if(i >= x)
                supmin[j].push_back(vmin[d.front()][j]);
        }
        while(!d.empty())
            d.pop_back();
    }

    for(j = 0 ; j < vmax[1].size() ; j++){
        for(i = 1 ; i <= n ; i++){
            while(!q.empty() && vmax[i][j] >= vmax[q.back()][j])
                q.pop_back();
            q.push_back(i);
            if(q.front() == i - x)
                q.pop_front();
            if(i >= x)
                supmax[j].push_back(vmax[q.front()][j]);
        }
        while(!q.empty())
            q.pop_back();
    }
    for(i = 0 ; i < vmin[1].size() ; i++){
        for(j = 0 ; j < supmin[i].size() ; j++)
            if(supmax[i][j] - supmin[i][j] < ansdif){
                ansdif = supmax[i][j] - supmin[i][j];
                ansnumber = 1;
            }else
                if(supmax[i][j] - supmin[i][j] == ansdif){
                    ansnumber++;
                }
    }

    for(i = 0 ; i < vmin[1].size() ; i++){
        while(!supmin[i].empty())
            supmin[i].pop_back();
        while(!supmax[i].empty())
            supmax[i].pop_back();
    }

    for(i = 1 ; i <= n ; i++){
        while(!vmin[i].empty())
            vmin[i].pop_back();
        while(!vmax[i].empty())
            vmax[i].pop_back();
    }
}

int main(){
    int i,j,x,y,i2,j2;
    f >> n >> m >> p;
    for(i = 1 ; i <= n ; i++)
        for(j = 1 ; j <= m ; j++)
            f >> mat[i][j];

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

        ansdif = inf;
        ansnumber = 0;

        solve(x,y);
        if(x != y)
            solve(y,x);

        g << ansdif << " " << ansnumber << "\n";
    }

    return 0;
}