Cod sursa(job #344936)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 1 septembrie 2009 11:58:35
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>
#include <values.h>
#define Nmax 5005
#define BIG MAXINT
struct numar{
	int pi,ps;
} a[Nmax];
int v[Nmax],p[Nmax];
int n,i,j,min,ok,nr,pi,z;

void sort(int l,int r){
	int i,j,xv,xp,y;
   i=l; j=r; xv=v[l+(r-l)/2]; xp=p[l+(r-l)/2];
   do{
   	while(v[i]<xv || (v[i]==xv && p[i]<xp)) i++;
      while(xv<v[j] || (v[j]==xv && xp<p[j])) j--;
      if(i<=j){
      	y=v[i]; v[i]=v[j]; v[j]=y;
         y=p[i]; p[i]=p[j]; p[j]=y;
         i++; j--;
      }
   } while(i<=j);
   if(i<r) sort(i,r);
   if(l<j) sort(l,j);
}

int main(){
	freopen("secv.in","r",stdin);
   freopen("secv.out","w",stdout);
   scanf("%d",&n);
   for(i=1;i<=n;++i) scanf("%d",&v[i]), p[i]=i;

   sort(1,n);

   v[n+1]=-1;
   for(i=2,nr=1,pi=1; i<=n+1; i++)
     if(v[i]==v[i-1]) nr++;
     else {
     		++z;
         a[z].pi=pi;
         a[z].ps=i-1;
         pi=i;
         nr=1;
     }

   ok=1; min=BIG;
   for(i=1;a[1].pi<=a[1].ps && ok;++a[1].pi){
     for(j=2;j<=z && ok;++j){
       while(p[a[j].pi]<p[a[j-1].pi] && a[j].pi<=a[j].ps) a[j].pi++;
       if( a[j].pi>a[j].ps ) ok=0;
     }
     if(ok) if( p[a[z].pi]-p[a[i].pi]+1< min)
        min=p[a[z].pi]-p[a[i].pi]+1;
   }

   if(min==BIG) printf("%d\n",-1);
   else printf("%d\n",min);
   fclose(stdin); fclose(stdout);
   return 0;
}