Pagini recente » Cod sursa (job #1495232) | Cod sursa (job #754628) | Cod sursa (job #2857725) | Cod sursa (job #2025196) | Cod sursa (job #2410033)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
const int inf = 0x3f3f3f3f;
int dp[MAXN];
int v[MAXN];
int t[MAXN];
void binara(int i) {
int best = 0;
for(int step = 20; step >= 0; -- step) {
if(best + (1<<step) < MAXN - 1 && dp[best+(1<<step)] != inf && v[dp[best+(1<<step)]] < v[i]) {
best += (1<<step);
}
}
dp[best + 1] = i;
t[i] = dp[best];
}
void afis(int i) {
if(i) {
afis(t[i]);
cout << v[i] << ' ';
}
}
int main() {
#ifdef BLAT
freopen("input", "r", stdin);
#else
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
memset(dp, 0x3f, sizeof dp);
dp[0] = 0;
for(int i = 1; i <= n; ++i) {
cin >> v[i];
binara(i);
}
for(int i = n; i; --i) {
if(dp[i] != inf) {
cout << i << '\n';
afis(dp[i]);
break;
}
}
return 0;
}