Pagini recente » Cod sursa (job #1129875) | Cod sursa (job #1917805) | Cod sursa (job #889424) | Cod sursa (job #490958) | Cod sursa (job #3138833)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cassert>
#include <cmath>
#include <stack>
#include <set>
#include <functional>
#include <bitset>
#include <map>
using namespace std;
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename A> ostream& operator<<(ostream &os, vector<A>&a) { for(auto &c:a)os<<c<<' '; return os;}
template<typename A> istream& operator>>(istream &os, vector<A>&a) { for(auto &c:a)os>>c; return os;}
template<typename A,size_t N> istream& operator>>(istream &os, array<A,N>&a) { for(auto &c:a)os>>c; return os;}
#define bug(a) cerr << "(" << #a << ": " << a << ")\n";
#define all(x) x.begin(),x.end()
#define pb push_back
using i64= int64_t;
using i16= int16_t;
using u64= uint64_t;
using u32= uint32_t;
using i32= int32_t;
const i32 inf=1e9;
const i64 INF=1e18;
const int mod=1e9+7;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
void solve()
{
int n;
cin>>n;
vector<int>a(n,inf);
int rez=0;
vector<int>urm(n,-1),e(n);
int poz=-1;
vector<int>v(n);
for(int i=0,x;i<n;i++)
{
cin>>x;
auto it=upper_bound(all(a),x);
*it=x;
int aux=it-a.begin()+1;
e[aux-1]=i;
if(aux>1)
{
urm[i]=e[aux-2];
}
if(aux>rez)
{
rez=aux;
poz=i;
}
v[i]=x;
}
cout<<rez<<'\n';
stack<int>st;
for(int i=1;i<=rez;i++,poz=urm[poz])
{
st.push(v[poz]);
}
while(st.size())
{
cout<<st.top()<<' ';
st.pop();
}
}
main()
{
int tt=1;
ios::sync_with_stdio(false);
cin.tie(0);
//cin>>tt;
while(tt--)
{
solve();
}
}