Pagini recente » Cod sursa (job #2516962) | Cod sursa (job #903604) | Cod sursa (job #445686) | Cod sursa (job #70759) | Cod sursa (job #654459)
Cod sursa(job #654459)
#include<stdio.h>
#include<algorithm>
#include<stack>
#define inf "scmax.in"
#define outf "scmax.out"
#define NMax 100001
using namespace std;
int N, A[NMax], u[NMax], n[NMax];
int AIB[NMax], b[NMax], best[NMax];
void read()
{
scanf("%d", &N);
for(int i=1; i<=N; i++) {
scanf("%d", &A[i]);
u[i] = A[i];
}
}
inline int lsb(int x) { return ( x & -x ); }
int query(int x) {
int rez = 0;
for(int i=x; i>=1; i-=lsb(x))
if( best[ AIB[i] ] > best[rez] ) rez = AIB[i];
return rez;
}
void update(int x, int ind) {
for(int i=x; i<=N; i+=lsb(i))
if( best[AIB[i]] < best[ind] ) AIB[i] = ind;
}
void solve()
{
sort(u+1, u+N+1);
int h = 1;
for(int i=2; i<=N; i++)
if( u[i]!=u[h] ) u[++h] = u[i];
for(int i=1; i<=N; i++) n[i] = lower_bound( u+1, u+h+1, A[i] ) - u;
for(int i=1; i<=N; i++) {
b[i] = query( n[i]-1 );
best[i] = best[b[i]] + 1;
update(n[i], i);
}
int rez = 1;
for(int i=2; i<=N; i++)
if( best[i]>best[rez] ) rez = i;
printf("%d\n", best[rez]);
stack<int> st;
while( rez ) {
st.push(A[rez]);
rez = b[rez];
}
while( !st.empty() ) {
printf("%d ", st.top());
st.pop();
}
}
int main()
{
freopen(inf,"r",stdin); freopen(outf,"w",stdout);
read(); solve();
return 0;
}