Pagini recente » Cod sursa (job #2016854) | Cod sursa (job #1599007) | Cod sursa (job #1090573) | Cod sursa (job #509881) | Cod sursa (job #1996920)
#include <fstream>
#include <vector>
using namespace std ;
ifstream cin ("scmax.in") ;
ofstream cout ("scmax.out") ;
int get (int value, int len, vector <int> &v, vector <int> &partial) {
int st = 0 ;
int dr = len ;
int sol = 1 ;
while (st <= dr) {
int mij = (st + dr) >> 1 ;
if (v[partial[mij]] < value) {
sol = mij ;
st = mij + 1 ;
}
else {
dr = mij - 1 ;
}
}
return sol ;
}
void rec (int poz, vector <int> &prev, vector <int> &v) {
if (poz == 0) {
return ;
}
rec (prev [poz], prev, v) ;
cout << v [poz] << ' ' ;
}
int main () {
int n ;
cin >> n ;
vector <int> v (n + 1, 0) ;
for (int i = 1 ; i <= n ; ++ i) {
cin >> v [i] ;
}
vector <int> dp (n + 1) ;
vector <int> prev (n + 1) ;
vector <int> partial (n + 1) ;
dp [1] = 1 ;
prev [1] = 0 ;
partial [1] = 1 ;
int inserted = 1 ;
int best = 1 ;
for (int i = 2 ; i <= n ; ++ i) {
int insertion_pos = get (v[i], inserted, v, partial) ;
partial [insertion_pos + 1] = i ;
dp [i] = insertion_pos + 1 ;
prev [i] = partial [insertion_pos] ;
if (inserted < insertion_pos + 1) {
inserted = insertion_pos + 1 ;
}
best = max (best, dp [i]) ;
}
cout << best << '\n' ;
for (int i = 1 ; i <= n ; ++ i) {
if (dp [i] == best) {
rec (i, prev, v) ;
return 0 ;
}
}
}