Pagini recente » Cod sursa (job #1261255) | Cod sursa (job #2688676) | Cod sursa (job #2084326) | Cod sursa (job #754652) | Cod sursa (job #2714906)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int NMAX = 1e5;
int N, a[NMAX + 5];
int k, t[NMAX + 5], pre[NMAX + 5];
int BS(int val) {
int st = 1, dr = k, sol = 0;
while(st <= dr) {
int mid = (st + dr) >> 1;
if(a[t[mid]] < val) {
sol = mid;
st = mid + 1;
} else {
dr = mid - 1;
}
}
return sol;
}
int main() {
cin >> N;
for(int i = 1; i <= N; i++) {
cin >> a[i];
}
k = 1;
t[1] = 1;
pre[1] = 0;
for(int i = 2; i <= N; i++) {
int p = BS(a[i]);
k = max(k, p + 1);
t[p + 1] = i;
pre[i] = t[p];
}
cout << k << '\n';
vector <int> sol;
int cp = t[k];
while(cp) {
sol.push_back(a[cp]);
cp = pre[cp];
}
reverse(sol.begin(), sol.end());
for(int it : sol) {
cout << it << ' ';
}
return 0;
}