Pagini recente » Cod sursa (job #2184677) | Cod sursa (job #745022) | Cod sursa (job #1906099) | Cod sursa (job #874721) | Cod sursa (job #1316715)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int initial[5010],unice[5010],d=2,inceput[5010],celmaimare[5010],n,minim=9999999;
struct bun
{
int termina[5010];
int marime;
int locatie;
void initializare()
{
int i;
for (i=1;i<=d;i++)
{
termina[i]=0;
}
}
};
vector <bun> incercari;
bun lavrajeala;
void quicksort(int inceput,int sfarsit)
{
int i=inceput;
int j=sfarsit;
int medie=initial[(i+j)/2];
while (i<=j)
{
while (initial[i]<medie){i++;}
while (initial[j]>medie){j--;}
if (i<=j)
{
swap (initial[i],initial[j]);
i++;
j--;
}
}
if (i<sfarsit){quicksort(i,sfarsit);}
if (j>inceput){quicksort(inceput,j);}
}
int cb(int cautat)
{
int i=1;
int j=d;
int mij=(i+j)/2;
while (unice[mij]!=cautat)
{
if (unice[mij]>cautat){j=mij-1;mij=(i+j)/2;}
if (unice[mij]<cautat){i=mij+1;mij=(i+j)/2;}
}
return mij;
}
void rez(int initial,int valoare,int alcatelea)
{
if (valoare==1)
{
if (initial-alcatelea+1<minim)
{
minim=initial-alcatelea+1;
}
}
if (celmaimare[valoare-1]<alcatelea)
{
rez(initial,valoare-1,celmaimare[valoare-1]);
}
else
{
int i;
for (i=alcatelea;i>=1;i--)
{
if (cb(inceput[i])==valoare-1)
{
celmaimare[valoare-1]=i;
rez(initial,valoare-1,i);
break;
}
}
}
}
int main()
{
ifstream in("secv.in");
ofstream out("secv.out");
int i,lungime=0,incluse=0;
in>>n;
for (i=1;i<=n;i++)
{
in>>initial[i];
inceput[i]=initial[i];
}
quicksort(1,n);
unice[1]=initial[1];
for (i=2;i<=n;i++)
{
if (initial[i]!=initial[i-1])
{
unice[d]=initial[i];
d++;
}
}
d--;
for (i=1;i<=d;i++)
{
celmaimare[i]=999999;
}
for (i=n;i>=1;i--)
{
if (inceput[i]==unice[d])
rez(i,d,i);
}if (minim>10000){minim=-1;}
out<<minim;
}