Pagini recente » Cod sursa (job #688483) | Cod sursa (job #2757722) | Cod sursa (job #3266060) | Cod sursa (job #707903) | Cod sursa (job #623881)
Cod sursa(job #623881)
#include <fstream>
#define NMAX 100006
using namespace std;
int a[NMAX]; //vectorul dat
int elem_lg[NMAX]; //elem_lg[x]=i -> elementul i din vect a este cel mai mic element cu care se poate incheia un subsir crescator de lungime x
int p[NMAX]; //predecesor
int n,lmax;
void citire()
{
int i;
ifstream fin("scmax.in");
fin>>n;
for (i=1;i<=n;++i)
fin>>a[i];
fin.close();
}
int cautare_bin(int key)
{
int ls=1, ld=lmax, mij;
int poz=0;
while (ls<=ld)
{
mij=(ls+ld)/2;
if (a[elem_lg[mij]]<key)
{
poz=mij;
ls=mij+1;
}
else
{
ld=mij-1;
}
}
return poz;
}
void rez()
{
int i,lg;
memset(elem_lg,0,sizeof(elem_lg));
elem_lg[1]=1; p[1]=0; lmax=1;
for (i=2;i<=n;++i)
{
lg=cautare_bin(a[i]); //caut binar lungimea celui mai mare subsir cresc pe care a[i] il poate continua
p[i]=elem_lg[lg];
if (lg==lmax)
elem_lg[++lmax]=i;
else
if (a[i]<a[elem_lg[lg+1]]) elem_lg[lg+1]=i;
}
}
void afisare()
{
ofstream fout("scmax.out");
fout<<lmax<<endl;
int subs[NMAX],nre=0,i,x;
x=elem_lg[lmax];
while (x)
{
subs[++nre]=x;
x=p[x];
}
for (i=nre; i; --i)
fout<<a[subs[i]]<<" ";
fout.close();
}
int main()
{
citire();
rez();
afisare();
return 0;
}