Pagini recente » Cod sursa (job #1872240) | Cod sursa (job #2625691) | Cod sursa (job #134334) | Cod sursa (job #2922188) | Cod sursa (job #1048690)
#include <fstream>
using namespace std;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
const int N = 100005;
int n;
int nr;
int v[N];
int best[N], lung[N], poz[N];
int caut (int x)
{
int p = 0, u = nr, m = (p+u)/2;
while (p <= u) {
if (v[lung[m]] < x && v[lung[m+1]] >= x) {
return m;
} else if (v[lung[m+1]] < x) {
p = m + 1;
m = (p + u)/2;
} else {
u = m - 1;
m = (p + u)/2;
}
}
return nr;
}
void afisare (int i)
{
if (poz[i] > 0) {
afisare(poz[i]);
}
out << v[i] << " ";
}
int main()
{
in >> n;
for (int i = 1; i <= n; i++) {
in >> v[i];
}
int pozitie;
nr = 1;
best[1] = lung[1] = 1;
lung[0] = 0;
for (int i = 2; i <= n; i++) {
pozitie = caut(v[i]);
poz[i] = lung[pozitie];
best[i] = pozitie + 1;
lung[pozitie + 1] = i;
if (nr < pozitie + 1) {
nr = pozitie + 1;
}
}
int maxim = 0;
pozitie = 0;
for (int i = 1; i <= n; i++) {
if (maxim < best[i]) {
maxim = best[i];
pozitie = i;
}
}
out << maxim << "\n";
afisare(pozitie);
return 0;
}