Pagini recente » Cod sursa (job #672834) | Cod sursa (job #1042198) | Cod sursa (job #26163) | Cod sursa (job #913650) | Cod sursa (job #1309411)
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int N = 100001;
long long n, v[N];
void citire() {
in >> n;
int i;
for (i=1; i<=n; i++)
in >> v[i];
}
long long aux[N], k, lung[N], lungMax;
int cautareBinara(long long element, int st, int dr) {
if (st > dr)
return 0;
else {
int m = (st + dr)/2;
if (element<=aux[m] && element > aux[m+1])
return m;
if (element > aux[m])
return cautareBinara(element,m+1,dr);
else
return cautareBinara(element,st,m-1);
}
}
void subsirCrescatorMax() {
aux[1] = v[1];
lung[1] = 1;
k = 1;
int i;
for (i=2; i<=n; i++) {
int pozitie = cautareBinara(v[i],1,k);
if (pozitie) {
aux[pozitie] = v[i];
lung[i] = pozitie;
if (lungMax < lung[i])
lungMax = lung[i];
}
else {
aux[++k] = v[i];
lung[i] = k;
if (lungMax < lung[i])
lungMax = lung[i];
}
}
}
void afisare() {
out << lungMax <<"\n";
int i;
for (i=1; i<=k; i++)
out <<aux[i] <<" ";
}
int main()
{
citire();
subsirCrescatorMax();
afisare();
return 0;
}