Pagini recente » Cod sursa (job #426596) | Cod sursa (job #2186104) | Cod sursa (job #76690) | Cod sursa (job #2095320) | Cod sursa (job #2234897)
#include <fstream>
#include <stack>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int MAXN = 1e5;
const int MAXVAL = 2e9;
const int INF = 1e9 + 1;
int v[MAXN + 1];
pair<int, int> len[MAXN + 1];
int n, dp[MAXN + 1], ant[MAXN + 1];
int cb(int val) {
int ret = 0, add = 1 << 20;
while (add) {
if (ret + add <= n && len[ret + add].first < val) ret += add;
add >>= 1;
}
return ret;
}
int main() {
in >> n;
for (int i = 1; i <= n; ++ i) {
in >> v[i];
len[i].first = INF;
}
int maxVal = 0, maxPoz;
for (int i = 1; i <= n; ++ i) {
int cnt = cb(v[i]);
dp[i] = cnt + 1;
if (maxVal < dp[i]) {
maxVal = dp[i];
maxPoz = i;
}
len[cnt + 1].first = v[i];
len[cnt + 1].second = i;
ant[i] = len[cnt].second;
}
stack<int> stiva;
int cur = maxPoz;
stiva.push(v[cur]);
while (ant[cur]) {
cur = ant[cur];
stiva.push(v[cur]);
}
out << maxVal << '\n';
while (stiva.size()) {
out << stiva.top() << ' ';
stiva.pop();
}
return 0;
}