Pagini recente » Cod sursa (job #2911726) | Cod sursa (job #1827690) | Cod sursa (job #1116164) | Cod sursa (job #2164352) | Cod sursa (job #1674627)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int v[100003];
int s[100003];
int o[100003];
int b[100003];
int aib[100003];
int k;
int n;
int query(int val) {
int rez = 0;
for(int i = val; i > 0; i -= i&-i)
if(aib[i] != 0)
return i;
return n;
}
int update(int val) {
for(int i = val; i <= n; i += i&-i)
aib[i]++;
}
int main() {
in >> n;
for(int i = 1; i <= n; i++) {
in >> v[i];
s[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 = 1; i <= n; i++) {
int q = query(v[i]-1)+1;
o[i] = o[q]+1;
b[i] = q;
if(o[i] > M) {
M = o[i];
MI = i;
}
update(v[i]);
}
stack<int> st;
int P = MI;
while(P != n+1) {
st.push(P);
P = b[P];
}
out << M << '\n';
while(!st.empty()) {
out << s[st.top()-1] << " ";
st.pop();
}
return 0;
}