Pagini recente » Cod sursa (job #1290541) | Cod sursa (job #1775645) | Cod sursa (job #2284491) | Cod sursa (job #318085) | Cod sursa (job #2794864)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int v[100005], dp[100005], lg[100005], rasp[100005];
int up_bound(int st, int dr, int k){
int mij, last;
while(st <= dr){
mij = (dr + st) / 2;
if(k <= v[lg[mij]]){
dr = mij - 1;
last = mij;
}
else {
st = mij + 1;
}
}
return last;
}
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i ++){
cin >> v[i];
}
for(int i = 1; i <= 10001; i ++){
lg[i] = n + 1;
}
v[n + 1] = 2000000005;
for(int i = 1; i <= n; i ++){
int poz = up_bound(1, n, v[i]);
lg[poz] = i;
dp[i] = lg[poz - 1];
}
int r = 1;
for(int i = 1; i <= n + 1; i ++){
if(lg[i] == n + 1){
r = i - 1;
i = n + 2;
}
}
cout << r << "\n";
int k = lg[r], x = 0;
while(k){
rasp[++ x] = k;
k = dp[k];
}
for(int i = r; i >= 1; i --){
cout << v[rasp[i]] << " ";
}
return 0;
}