Pagini recente » Cod sursa (job #1100166) | Cod sursa (job #3217681) | Cod sursa (job #2589381) | Cod sursa (job #2602528) | Cod sursa (job #2609705)
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define lll long long
#define fi first
#define rest se.fi
#define suma se.se
#define sir first
#define se second
using namespace std;
const lll NR = 2e5 + 10 , oo = 2e9 + 100 ;
void boost () {
#ifndef ONLINE_JUDGE
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
#endif
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
}
int dp [ NR ] , n , maxind , pos [ NR ] , last [ NR ] , a [ NR ] ;
void rec ( int x ) {
if ( !x ) return ;
rec ( last [ x ] ) ;
cout << a [ x ] << ' ' ;
}
int main() {
int i , j , x , y , jj , st , dr , mij , sol ;
boost() ;
cin >> n ;
dp [ 0 ] = 0 ;
for ( i = 1 ; i <= n ; ++ i )
dp [ i ] = oo ;
for ( i = 1 ; i <= n ; ++ i ) {
cin >> a [ i ] ;
x = a [ i ] ;
st = 1 ; dr = n ; sol = 0 ;
while ( st <= dr ) {
mij = ( st + dr ) >> 1 ;
if ( dp [ mij ] < x ) {
sol = mij ;
st = mij + 1 ;
} else {
dr = mij - 1 ;
}
}
if ( x < dp [ sol + 1 ] ) {
dp [ sol + 1 ] = x ;
pos [ sol + 1 ] = i ;
last [ i ] = pos [ sol ] ;
}
maxind = max ( maxind , sol + 1 ) ;
}
cout << maxind << '\n' ;
rec ( pos [ maxind ] ) ;
return 0;
}