Pagini recente » Profil Rama | Cod sursa (job #2022709) | Cod sursa (job #1829619) | Istoria paginii runda/jboi_day1_mirror | Cod sursa (job #2967569)
#include <fstream>
using namespace std;
const int MAX = 1e5 + 2;
const int inf = 2e9 + 1;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int dp[MAX], v[MAX] , n , a , maxim , x , pre[MAX] , ind[MAX];
// dp[i] = numarul minim cu care s-ar termina un subsir de lungime i;
int bs( int x ){
int st = 0 , dr = n;
int mij , ans;
while( st <= dr ){
mij = (st+dr)/2;
if(dp[mij] < x){
ans = mij;
st = mij + 1;
}else dr = mij - 1;
}
return ans;
}
void rec( int x ){
if(!x) return;
rec(pre[x]);
cout << v[x] << ' ';
}
int main()
{
int poz;
cin >> n;
dp[0] = 0;
for(int i = 1 ; i <= n ; i++){
dp[i] = inf;
}
for(int i = 1 ; i <= n ; i++){
cin >> v[i];
a = v[i];
x = bs(a);
if( x + 1 <= n && a < dp[x+1]){
dp[x + 1] = a;
pre[i] = ind[x];
ind[x + 1] = i;
if( x + 1 > maxim ){
maxim = x + 1;
poz = i;
}
}
}
cout << maxim << '\n';
rec(poz);
return 0;
}