Cod sursa(job #42566)

Utilizator alecmanAchim Ioan Alexandru alecman Data 29 martie 2007 12:15:02
Problema Secv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
/*
 *
 *
  info-arena 2.0 - Arhiva - Secv
 *
 *
 */

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

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

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

typedef struct elem
{
  long valoare;
  struct elem *urm;
};
typedef elem *reper;

reper p;
long min,max,a[5001];
int pmin,pmax,n;

void citire();
void rezolvare();

int main()
{
  p=new elem;
  p->valoare=-1;
  p->urm=NULL;
  citire();
  if(n==1)
    fprintf(fout, "1\n");
  else
  if(n==0)
    fprintf(fout, "0\n");
  else
    rezolvare();
  fclose(fin);
  fclose(fout);
  return 0;
}

void citire()
{
  fscanf(fin, "%d", &n);
  int l=0;
  min=INFI;
  max=-INFI;
  pmin=0;
  pmax=0;
  reper adr,adr2;
  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;
    }
      adr=new elem;
      adr->valoare=a[i];
      adr->urm=NULL;
      adr2=p;
      l=0;
      while(adr2!=NULL&&!l)
      {
        if(adr2->valoare<a[i]&&adr2->urm->valoare>a[i])
        {
          adr->urm=adr2->urm;
          adr2->urm=adr;
          l=1;
        }
        if(adr2->valoare==a[i])
          l=1;
        if(!l&&adr2->urm==NULL)
        {
          adr2->urm=adr;
          l=1;
        }
        adr2=adr2->urm;
      }
  }
}

void rezolvare()
{
  int poz=0,l=0,iesi=0;
  long lungime=INFI;
  reper adr;
  while(pmin!=pmax)
  {
    adr=p;
    adr=adr->urm;
    poz=pmin;
    l=0;
    iesi=0;
    for(int i=poz;i<=pmax&&!iesi;++i)
    {
      if(a[i]==min&&i!=poz&&!l)
      {
        pmin=i;
        l=1;
      }
      if(a[i]==adr->valoare)
        adr=adr->urm;
      if(adr==NULL)
      {
        if(lungime>i-poz+1)
          lungime=i-poz+1;
        iesi=1;
      }
      if(i==pmax&&adr!=NULL)
        pmin=pmax;
    }
    if(poz==pmin)
      break;
  }
  fprintf(fout, "%ld\n", lungime);
}