Cod sursa(job #42588)

Utilizator alecmanAchim Ioan Alexandru alecman Data 29 martie 2007 12:45:11
Problema Secv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
/*
 *
 *
  info-arena 2.0 - Arhiva - Secv
 *
 *
 */

#include<stdio.h>
#include<string.h>

#define INPUT "secv.in"
#define OUTPUT "secv.out"
#define INFI 2000000010

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

int n,k,pmin,pmax;
long a[5001],b[5001],c[5001],min,max;

void citire();
void quicks(int st, int dr);
void elimina();
void rezolva();

int main()
{
  citire();
  if(n==0)
    fprintf(fout, "0\n");
  else
  if(n==1)
    fprintf(fout, "1\n");
  else
  {
    quicks(1,n);
    elimina();
    rezolva();
  }
  fclose(fin);
  fclose(fout);
  return 0;
}

void citire()
{
  fscanf(fin, "%d", &n);
  min=INFI;
  max=-INFI;
  pmin=pmax=0;
  for(int i=1;i<=n;++i)
  {
    fscanf(fin, "%ld", &a[i]);
    if(a[i]<min)
    {
      min=a[i];
      pmin=i;
    }
    if(a[i]>=max)
    {
      max=a[i];
      pmax=i;
    }
  }
  memcpy(b,a,sizeof(a));
}

void quicks(int st, int dr)
{
  int l=st,m=dr;
  while(l!=m)
  {
    if((l<m&&b[l]>b[m])||(l>m&&b[l]<b[m]))
    {
      b[l]=b[l]+b[m];
      b[m]=b[l]-b[m];
      b[l]=b[l]-b[m];
      l=l+m;
      m=l-m;
      l=l-m;
      if(l<m)
        --m;
      else
        ++m;
    }
    else
      if(l<m)
        --m;
      else
        ++m;
  }
  if(l!=st) quicks(st,l-1);
  if(l!=dr) quicks(l+1,dr);
}

void elimina()
{
  c[1]=b[1];
  k=2;
  for(int i=2;i<=n;++i)
    if(b[i]!=b[i-1])
      c[k++]=b[i];
}

void rezolva()
{
  int poz,j,l;
  long lungime=INFI;
  while(pmin!=pmax)
  {
    l=0;
    poz=pmin;
    j=1;
    for(int i=poz;i<=pmax;++i)
    {
      if(a[i]==min&&i!=pmin&&!l)
      {
        pmin=i;
        l=1;
      }
      if(c[j]==a[i])
        ++j;
      if(j==k)
        if(lungime>i-poz+1)
          lungime=i-poz+1;
    }
    if(pmin==poz)
      break;
  }
  if(lungime!=INFI)
  fprintf(fout, "%ld\n", lungime);
  else
  fprintf(fout, "0\n");
}