Pagini recente » Cod sursa (job #1648912) | Cod sursa (job #1351642) | Cod sursa (job #1428021) | Cod sursa (job #2445190) | Cod sursa (job #1073878)
using namespace std;
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<utility>
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<numeric>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<deque>
#define FILES
#ifdef FILES
#include<fstream>
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#else
#include<iostream>
#endif
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define ALL(a) a.begin(),a.end()
#define p_b(a) push_back(a)
#define m_p(a,b) make_pair(a,b)
#define p_p(a,b) p_b(m_p(a,b))
typedef unsigned char uchar;
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vint;
typedef queue<int> qint;
typedef pair<int,int> pii;
typedef queue<pii> qpii;
typedef vector<pii> vpii;
typedef vector<string> vstr;
typedef vector<ll> vll;
typedef deque<int> dqint;
typedef deque<ll> dqll;
typedef map<string,int> mpstri;
typedef map<int,int> mpinti;
typedef map<string,string> mpstrs;
typedef map<string,vstr> mpstrvs;
const int INFI=(1LL<<31)-10;
const ll INFL=(1LL<<62);
const double eps=1e-7;
const long double pi=acos(-1.0);
const int MAXN=100002;
int v[MAXN],key[MAXN],lon[MAXN],prec[MAXN],idx[MAXN];
pii u[MAXN];
bool cmp(const pii& p1,const pii &p2){
return p1.first<p2.first;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>v[i];
u[i].first=v[i];
u[i].second=i;
}
sort(u+1,u+n+1,cmp);
int nr=1;
v[u[1].second]=1;
key[1]=u[1].first;
for(int i=2;i<=n;i++){
if(u[i].first!=u[i-1].first){
nr++;
}
v[u[i].second]=nr;
key[nr]=u[i].first;
}
for(int i=0;i<MAXN;i++){
lon[i]=INFI;
}
lon[1]=v[1];
idx[1]=1;
for(int i=2;i<=n;i++){
int pz=lower_bound(lon+1,lon+n+1,v[i])-lon;
lon[pz]=v[i];
prec[i]=idx[pz-1];
idx[pz]=i;
}
int mxp;
for(int i=n;i>=1;i--){
if(lon[i]!=INFI){
cout<<i<<'\n';
mxp=idx[i];
break;
}
}
vint sl;
while(mxp){
sl.p_b(mxp);
mxp=prec[mxp];
}
for(int i=sl.size()-1;i>=0;i--){
cout<<key[v[sl[i]]]<<" ";
}
return 0;
}