Cod sursa(job #334319)

Utilizator mlazariLazari Mihai mlazari Data 26 iulie 2009 10:06:00
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<stdio.h>

#define NMAX 1003

int i,j,m,n,p,dx,dy,difmin,nter;
int a[NMAX][NMAX],pmin[NMAX][NMAX],pmax[NMAX][NMAX];
int dlmin[NMAX][NMAX],dlmax[NMAX][NMAX],dcmin[NMAX][NMAX],dcmax[NMAX][NMAX];
int plmin[NMAX],ulmin[NMAX],plmax[NMAX],ulmax[NMAX],pcmin[NMAX],ucmin[NMAX],pcmax[NMAX],ucmax[NMAX];

void oferta(int x,int y) {
  int dif;
  for(i=0;i<m;i++) {
    plmin[i]=plmax[i]=1;
    ulmin[i]=ulmax[i]=0;
  }
  for(i=0;i<n;i++) {
    pcmin[i]=pcmax[i]=1;
    ucmin[i]=ucmax[i]=0;
  }
  for(i=0;i<m;i++)
   for(j=0;j<n;j++) {

     // lmin
     while((ulmin[i]>=plmin[i])&&(a[i][dlmin[i][ulmin[i]]]>=a[i][j])) ulmin[i]--;
     dlmin[i][++ulmin[i]]=j;
     if(j-dlmin[i][plmin[i]]+1>x) plmin[i]++;
     pmin[i][j]=dlmin[i][plmin[i]];

     // lmax
     while((ulmax[i]>=plmax[i])&&(a[i][dlmax[i][ulmax[i]]]<=a[i][j])) ulmax[i]--;
     dlmax[i][++ulmax[i]]=j;
     if(j-dlmax[i][plmax[i]]+1>x) plmax[i]++;
     pmax[i][j]=dlmax[i][plmax[i]];

     // cmin
     while((ucmin[j]>=pcmin[j])&&(a[dcmin[j][ucmin[j]]][pmin[dcmin[j][ucmin[j]]][j]]>=a[i][pmin[i][j]]))
      ucmin[j]--;
     dcmin[j][++ucmin[j]]=i;
     if(i-dcmin[j][pcmin[j]]+1>y) pcmin[j]++;

     // cmax
     while((ucmax[j]>=pcmax[j])&&(a[dcmax[j][ucmax[j]]][pmax[dcmax[j][ucmax[j]]][j]]<=a[i][pmax[i][j]]))
      ucmax[j]--;
     dcmax[j][++ucmax[j]]=i;
     if(i-dcmax[j][pcmax[j]]+1>y) pcmax[j]++;

     if((i>=y-1)&&(j>=x-1)) {
       dif=a[dcmax[j][pcmax[j]]][pmax[dcmax[j][pcmax[j]]][j]]-a[dcmin[j][pcmin[j]]][pmin[dcmin[j][pcmin[j]]][j]];
       if(dif<difmin) {
         difmin=dif;
         nter=1;
       }
       else
        if(dif==difmin) nter++;
     }
   }
}

int main() {
  char s[5003];
  int id;
  freopen("struti.in","r",stdin);
  freopen("struti.out","w",stdout);
  scanf("%d %d %d\n",&m,&n,&p);
  for(i=0;i<m;i++) {
    fgets(s,5003,stdin);
    id=0;
    for(j=0;j<n;j++) {
       a[i][j]=0;
       while((s[id]>='0')&&(s[id]<='9')) a[i][j]=a[i][j]*10+s[id++]-'0';
       id++;
    }
  }
  for(;p--;) {
    scanf("%d %d",&dx,&dy);
    difmin=10000;
    oferta(dx,dy);
    if(dx!=dy) oferta(dy,dx);
    printf("%d %d\n",difmin,nter);
  }
}