Pagini recente » Cod sursa (job #328283) | Cod sursa (job #1623471) | Cod sursa (job #43269) | Cod sursa (job #1263713) | Cod sursa (job #1674734)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <limits.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int v[100003];
int t[100003];
int s[100003];
int o[100003];
int b[100003];
int aib[100003];
int k;
int n;
int query(int val) {
int M = 0;
for(int i = val; i > 0; i -= i&-i)
if(o[M] < o[aib[i]])
M = aib[i];
return M;
}
int update(int val, int ind) {
for(int i = val; i <= n; i += i&-i)
if(o[ind] > o[aib[i]])
aib[i] = ind;
}
int main() {
in >> n;
for(int i = 1; i <= n; i++) {
in >> v[i];
s[i] = v[i];
t[i] = v[i];
}
sort(s+1, s+n+1);
for(int i = 1; i <= n; i++)
v[i] = lower_bound(s, s+n, v[i])-s;
int M = 0;
int MI = 0;
for(int i = n; i >= 1; i--) {
int q = query(n+1-(v[i]+1));
o[i] = o[q]+1;
b[i] = q;
if(o[i] > M) {
M = o[i];
MI = i;
}
update(n+1-v[i], i);
}
out << M << '\n';
while(MI != 0) {
out << t[MI] << " ";
MI = b[MI];
}
return 0;
}