Cod sursa(job #334379)

Utilizator mlazariLazari Mihai mlazari Data 26 iulie 2009 15:23:54
Problema Struti Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 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],dlmax[NMAX],dcmin[NMAX][NMAX],dcmax[NMAX][NMAX];
int plmin,ulmin,plmax,ulmax,pcmin[NMAX],ucmin[NMAX],pcmax[NMAX],ucmax[NMAX];

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

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

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

      if(j>=x-1) {
        // cmin
        pr=pcmin[j];
        u=ucmin[j];
        while((u>=pr)&&(pmin[dcmin[j][u]][j]>=minp)) u--;
        dcmin[j][++u]=i;
        ucmin[j]=u;
        if(i-dcmin[j][pr]+1>y) pcmin[j]++;
        // cmax
        pr=pcmax[j];
        u=ucmax[j];
        while((u>=pr)&&(pmax[dcmax[j][u]][j]<=maxp)) u--;
        dcmax[j][++u]=i;
        ucmax[j]=u;
        if(i-dcmax[j][pr]+1>y) pcmax[j]++;

        if(i>=y-1) {
          dif=pmax[dcmax[j][pcmax[j]]][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);
  }
}