Pagini recente » Cod sursa (job #2463652) | Cod sursa (job #1722940) | Cod sursa (job #1909421) | Cod sursa (job #1223670) | Cod sursa (job #2255738)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 100005;
int dp[NMAX], v[NMAX], pos[NMAX], best[NMAX];
int main() {
int n;
in >> n;
for(int i = 1; i <= n; i ++)
in >> v[i];
for(int i = 2; i <= n; i ++)
dp[i] = INT_MAX;
dp[1] = v[1];
pos[1] = 1;
for(int i = 2; i <= n; i ++) {
int ans = 0;
for(int step = (1 << 16); step; step >>= 1)
if(ans + step <= n && v[i] > dp[ans + step])
ans += step;
if(v[i] < dp[ans + 1]) {
pos[ans + 1] = i;
dp[ans + 1] = v[i];
}
best[i] = ans + 1;
}
int sol;
for(sol = n; sol >= 1 && dp[sol] == INT_MAX; sol --);
out << sol << "\n";
int i = n, last = n + 1;
v[n + 1] = INT_MAX;
vector<int> aux(sol, 0);
while(sol) {
if(best[i] == sol && v[i] < v[last]) {
sol--;
aux[sol] = v[i];
last = i;
}
i --;
}
for(auto it : aux)
out << it << " ";
return 0;
}