Cod sursa(job #1083692)

Utilizator Aleks10FMI - Petrache Alex Aleks10 Data 16 ianuarie 2014 11:39:02
Problema Struti Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <string.h>

#define MAX_N 1001
using namespace std;

int n,m,p,a,b,i,j,p1=1,p2=1,u1=1,u2=1,vf=0,Min[MAX_N][MAX_N],Max[MAX_N][MAX_N],minim[MAX_N],maxim[MAX_N],v[MAX_N][MAX_N],rasp,temp,nr;
void solve(int x, int y){
    for(i=1;i<=n;i++){
        p1=1;p2=1;u1=1;u2=1;vf=0;
        minim[1]=1;
        maxim[1]=1;
        for(j=2;j<=m;j++){
            while(v[i][j]<=v[i][minim[u1]] && u1>=p1)
                u1--;
            while(v[i][j]>=v[i][maxim[u2]] && u2>=p2)
                u2--;
            u1++;
            minim[u1]=j;
            u2++;
            maxim[u2]=j;

            if((j-minim[p1])>=y)
                p1++;
            if((j-maxim[p2])>=y)
                p2++;

            if(j>=y){
                vf++;
                Min[i][vf]=v[i][minim[p1]];
                Max[i][vf]=v[i][maxim[p2]];
            }
        }
    }

    memset(minim,0,sizeof(minim));
    memset(maxim,0,sizeof(maxim));

    for(i=1;i<=vf;i++){
        p1=1;p2=1;u1=1;u2=1;
        minim[1]=1;maxim[1]=1;
        for(j=1;j<=n;j++){
            while(Min[j][i]<=Min[minim[u1]][i] && u1>=p1)
                u1--;
            while(Max[j][i]>=Max[maxim[u2]][i] && u2>=p2)
                u2--;
            u1++;
            u2++;
            minim[u1]=j;
            maxim[u2]=j;

            if(j-minim[p1]>=x)
                p1++;
            if(j-maxim[p2]>=x)
                p2++;

            if(j>=x){
                temp=abs(Min[minim[p1]][i]-Max[maxim[p2]][i]);
                if(temp<rasp){
                    rasp=temp;
                    nr=1;
                }
                else if(temp==rasp)
                    nr++;
            }
        }
    }
}

int main()
{
    ifstream f("struti.in");
    ofstream g("struti.out");
    f>>n>>m>>p;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            f>>v[i][j];
    int k;
    for(k=0;k<p;k++){
        f>>a>>b;
        rasp=1000000000;
        solve(a,b);
        if(a!=b)
            solve(a,b);
        g<<rasp<<" "<<nr<<'\n';
    }
    return 0;
}