Cod sursa(job #178740)

Utilizator eugen.nodeaEugen Nodea eugen.nodea Data 15 aprilie 2008 00:20:13
Problema Secv Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
# include <stdio.h>
# include <string.h>
const int nmax=50001;
long N,i,v[nmax],c[nmax],j,k,pm,pM,p,ok,L;
void qsort(long v[nmax], long left, long right)
{ long i=left, j=right;
  long x=v[(i + j)/2],y;
  do
  {   while (v[i] < x) i++;
      while (v[j] > x) j--;
      if (i <= j){
	y=v[i]; v[i]=v[j]; v[j]=y;
	i++; j--;
      }
  } while (i <= j);
  if (left < j) qsort(v, left, j);
  if (i < right) qsort(v, i, right);
}

int main()
{
  freopen("secv.in","r",stdin);
  freopen("secv.out","w",stdout);
  scanf("%ld",&N);
  pM=pm=1;
  for(i=1;i<=N;i++)
  {
      scanf("%ld",&v[i]);
      if (v[i]<v[pm]) pm=i;
      if (v[i]>=v[pM]) pM=i;
  }
  memcpy(c,v,sizeof(v));
  qsort (c,1,N);
  k=1;
  for (j=2;j<=N;j++)
    if (c[k]!=c[j]) {
       c[k+1]=c[j];
       k++;
     }
  j=1;ok=0;p=pm;
  while (p<=pM && !ok)
  {
    if (v[p]==c[1]) {
    i=p;
    while (i<=pM && j<=k){
      if (v[i]==c[j]) j++;
	i++;
       }
    if (j>k) {
		ok=1;
		L=i-p;
		break;
	      }
	    else p++;
     }
     else p++;
  }
  if (ok) printf("%ld",L);
    else printf("-1");
 return 0;
}