Pagini recente » Cod sursa (job #2912140) | Cod sursa (job #123054) | Cod sursa (job #1731145) | Cod sursa (job #1761752) | Cod sursa (job #2013736)
#include <fstream>
#define nmax 100002
using namespace std;
fstream f1("scmax.in", ios::in);
fstream f2("scmax.out", ios::out);
long int n, v[nmax], lung[nmax], s[nmax], sol[nmax], lmax;
///s[i]=cel mai mic el din v ce termina o secv strict cresc de lung i
//lung[i]= lung maxima secv strict cresc ce se termina cu el v[i]
///lmax= lungime secv strict cresc maximala
void citire()
{
long int i;
f1>>n;
for(i=1; i<=n; i++)
f1>>v[i];
}
long int cauta(long int st, long int dr, long int val)
{
if(st<=dr)
{
long int mijl=(st+dr)/2;
if(val<=s[mijl]) return cauta(st, mijl-1, val);
else return cauta(mijl+1, dr, val);
}
else return st;
}
void solutie()
{
long int i;
for(i=1; i<=n; i++)
if(v[i]> s[lmax])
{
lmax++;
s[lmax]=v[i];
lung[i]=lmax;
}
else
{
lung[i]=cauta(1, lmax, v[i]);
s[lung[i]]=v[i];
}
}
void afisare()
{
long int i, j=lmax;
f2<<lmax<<"\n";
for(i=n; (i>=1)&&(j); i--)
if(j==lung[i]) {sol[j]=v[i]; j--;}
for(i=1; i<=lmax; i++)
f2<<sol[i]<<" ";
}
int main()
{
citire();
solutie();
afisare();
return 0;
}