Cod sursa(job #1072613)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 4 ianuarie 2014 17:56:12
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.49 kb
#include <iostream>
#include <fstream>
 
const static int NMAX = 1001, MMAX = 1001;
const static int MAXVAL = 8001;
 
using namespace std;
 
int matrix[NMAX][MMAX];
int minMatrix[NMAX][MMAX];
int maxMatrix[NMAX][MMAX];
 
pair<int,int> dequeMIN[NMAX * MMAX + 1];
pair<int,int> dequeMAX[NMAX * MMAX + 1];
int headMIN = 0 , tailMIN = 0;
int headMAX = 0 , tailMAX = 0;
 
ifstream input("struti.in");
ofstream output("struti.out");
 
int N , M , P;
int answer , numApp = 0;
 
int search(int x , int y)
{
    for (int j = 1 ; j <= M ; j++)
    {
        tailMIN = 0;
        tailMAX = 0;
        headMIN = 1;
        headMAX = 1;
        for (int i = 1; i < x ; i++)
        {
            while(tailMIN >= headMIN && dequeMIN[tailMIN].first >= matrix[i][j]) tailMIN --;
            while(tailMAX >= headMAX && dequeMAX[tailMAX].first <= matrix[i][j]) tailMAX --;
            dequeMIN[++tailMIN] = make_pair(matrix[i][j],i);
            dequeMAX[++tailMAX] = make_pair(matrix[i][j],i);
        }
 
        for (int i = x ; i <= N ; i++)
        {
            while(tailMIN >= headMIN && dequeMIN[tailMIN].first >= matrix[i][j]) tailMIN --;
            while(tailMAX >= headMAX && dequeMAX[tailMAX].first <= matrix[i][j]) tailMAX --;
            dequeMIN[++tailMIN] = make_pair(matrix[i][j],i);
            dequeMAX[++tailMAX] = make_pair(matrix[i][j],i);
            if (dequeMIN[headMIN].second <= i - x) headMIN ++ ;
            if (dequeMAX[headMAX].second <= i - x) headMAX ++ ;
            minMatrix[i][j] = dequeMIN[headMIN].first;
            maxMatrix[i][j] = dequeMAX[headMAX].first;
        }
    }
 
    for (int i = x; i <= N ; i++)
    {
        tailMIN = 0;
        tailMAX = 0;
        headMIN = 1;
        headMAX = 1;
        for (int j = 1; j < y ; j++)
        {
            while(tailMIN >= headMIN && dequeMIN[tailMIN].first >= minMatrix[i][j]) tailMIN --;
            while(tailMAX >= headMAX && dequeMAX[tailMAX].first <= maxMatrix[i][j]) tailMAX --;
            dequeMIN[++tailMIN] = make_pair(minMatrix[i][j],j);
            dequeMAX[++tailMAX] = make_pair(maxMatrix[i][j],j);
        }
        for (int j = y ; j <= M ; j++)
        {
            while(tailMIN >= headMIN && dequeMIN[tailMIN].first >= minMatrix[i][j]) tailMIN --;
            while(tailMAX >= headMAX && dequeMAX[tailMAX].first <= maxMatrix[i][j]) tailMAX --;
            dequeMIN[++tailMIN] = make_pair(minMatrix[i][j],j);
            dequeMAX[++tailMAX] = make_pair(maxMatrix[i][j],j);
 
            if (dequeMIN[headMIN].second <= j - y) headMIN ++;
            if (dequeMAX[headMAX].second <= j - y) headMAX ++;
            minMatrix[i][j] = dequeMIN[headMIN].first;
            maxMatrix[i][j] = dequeMAX[headMAX].first;
            if (answer > maxMatrix[i][j] - minMatrix[i][j])
            {
                answer = maxMatrix[i][j] - minMatrix[i][j];
                numApp = 1;
            }
            else if (answer == maxMatrix[i][j] - minMatrix[i][j])
            {
                numApp ++;
            }
        }
    }
}
 
int main()
{
    input >> N >> M >> P;
    for (int i = 1; i <= N ; i++)
        for (int j = 1;j <= M ; j++)
        input >> matrix[i][j];
 
    for (int i = 0; i < P ; i++)
    {
        answer = MAXVAL;
        numApp = 0;
        int x , y;
        input >> x >> y;
        search(x,y);
        if (x != y) search(y,x);
        output << answer << " " << numApp << "\n";
    }
    input.close();
    output.close();
 
    return 0;
}