Cod sursa(job #53323)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 21 aprilie 2007 19:46:54
Problema Secv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
std::ifstream f1("secv.in");
std::ofstream f2("secv.out");

void mergesort(long sir[5000], int jos, int sus);
void merge(long sir[5000], int jos, int mij, int sus);
int bsearch(long s[5000], int jos, int sus, long x);

int main()
{
	int n, i, j, poz, m, min;
	long sir[5000], subsir[5000], a[5000];
	f1>>n;
	for (i=0; i<n; i++)
	{
		f1>>sir[i];
		subsir[i]=sir[i];
	}//for i
	mergesort(subsir, 0, n-1);
	i=1;
	j=1;
	while (j<n)
	{
		while ((j<n)&&(subsir[i-1]==subsir[j]))
			j++;
		if (j<n)
		{
		  subsir[i]=subsir[j];
		  i++;
		}//if
	}//while
	m=i;
	min=6000;
	for (i=0; i<n; i++)
	{
		poz=bsearch(subsir, 0, m-1, sir[i]);
    if (poz==0)
			a[i]=1;
		else
		{
			j=i;
			while ((j>0)&&(sir[j]!=subsir[poz-1]))
				j--;
			if ((sir[j]==subsir[poz-1])&&(a[j]>0))
				a[i]=a[j]+i-j;	
			else
				a[i]=0;
		}//else
		if ((poz==(m-1))&&(a[i]>0)&&(min>a[i]))
			min=a[i];
	}//for i
	f2<<min;
	f1.close();
	f2.close();
	return 0;
}//main


void mergesort(long sir[5000], int jos, int sus)
{
	if (jos<sus)
	{
		int mij=(jos+sus)/2;
		mergesort(sir, jos, mij);
		mergesort(sir, mij+1, sus);
		merge(sir, jos, mij, sus);
	}//if
}//mergesort

void merge(long sir[5000], int jos, int mij, int sus)
{
	int i1=jos, i2=mij+1, ib=jos, i;
	long b[5000];
	while ((i1<=mij)&&(i2<=sus))
	{
		if (sir[i1]<sir[i2])
		{
			b[ib]=sir[i1];
			i1++;
		}//if
		else
		{
			b[ib]=sir[i2];
			i2++;
		}//else
		ib++;
	}//while
	for (i=i1; i<=mij; i++)
		b[ib+i-i1]=sir[i];
	for (i=i2; i<=sus; i++)
		b[ib+i-i2]=sir[i];
	for (i=jos; i<=sus; i++)
		sir[i]=b[i];
}//merge

int bsearch(long s[5000], int jos, int sus, long x)
{
	int mij=(jos+sus)/2;
	if (x<s[mij])
		return bsearch(s, jos, mij-1, x);
	else
		if (x>s[mij])
			return bsearch(s, mij+1, sus, x);
	  else
			return mij;
}//bsearch