structBIT { /* ======================================== */ ll tr[maxn]; int sz; voidinit( int N ){ sz = N + 1; fill( tr, tr + sz + 2, -inf ); } voidupd( int idx, ll val ){ idx ++; for( int i = idx; i <= sz; i += i & -i ) tr[i] = max( tr[i], val ); } ll ask( int idx ){ idx ++; ll res = -inf; for( int i = idx; i; i -= i & -i ) res = max( res, tr[i] ); return res; } /* ======================================== */ } bit;
ll p[maxn];
voidsolve( ){ int n = read( ); for( int i = 1; i <= n; ++ i ) p[i] = read( );
bit.init( n ); bit.upd( 0, 0 );
int mx = 0; int offset = 0; for( int i = 1; i <= n; ++ i ) { int v = p[i]; if( v > mx ) { offset ++; int pre = bit.ask( n ); bit.upd( mx, pre ); mx = v; } else { int pre = bit.ask( v - 1 ); bit.upd( v, pre + 1 ); } } cout << bit.ask( n ) + offset << '\n'; }