Pagini recente » Cod sursa (job #662669) | redsnow_2 | Cod sursa (job #1552785) | Monitorul de evaluare | Cod sursa (job #1774718)
#include<fstream>
#include<iostream>
using namespace std;
#define MAX 100001
ifstream f("scmax.in");
int a[MAX], b[MAX], poz[MAX];
int n, m;
void citire() {
int i;
f >> n;
for (i = 1; i <= n; i++)
f >> a[i];
}
int caut (int p, int u, int x) {
int m;
while (p <= u) {
m = p + (u - p) / 2;
if (x < a[b[m]])
p = m + 1;
else
u = m - 1;
}
return p;
}
void subsir() {
int i, j, k;
a[0] = 1234567890;
for (i = n; i >= 1; i--) {
poz[i] = 0;
k = caut (1, m, a[i]);
if (k > m) {
poz[i] = b[k - 1];
m = k;
b[k] = i;
}
else {
poz[i] = b[k - 1];
if (a[b[k]] < a[i])
b[k] = i;
}
}
}
void tipar() {
int i;
cout << m << '\n';
for (i = b[m]; i > 0; i = poz[i]) {
cout << a[i] << ' ';
}
}
int main() {
citire();
subsir();
tipar();
f.close();
return 0;
}