Pagini recente » Cod sursa (job #611282) | Cod sursa (job #793814) | Statistici Corina Catarau (Corinne94s) | Cod sursa (job #2021682) | Cod sursa (job #2733098)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
typedef long long ll;
const int nmax = 1e5 + 5;
int n, v[nmax], dp[nmax], idx[nmax];
void read(){
cin >> n;
for(int i = 1; i <= n; i++)
cin >> v[i];
}
int srch(int val, int m){
int l = 1, r = m, sol = 0;
while(l <= r){
int mid = (l + r) / 2;
if(dp[mid] >= val){
r = mid - 1;
sol = mid;
} else
l = mid + 1;
}
return sol;
}
void print(int k){
int j = n;
int ans[k + 1];
for(int i = k; i >= 1; i--){
while(idx[j] != i)
j--;
ans[i] = v[j];
}
cout << k << "\n";
for(int i = 1; i <= k; i++)
cout << ans[i] << " ";
}
void solve(){
int k = 1;
dp[1] = v[1];
idx[1] = 1;
for(int i = 2; i <= n; i++)
if(v[i] > dp[k]){
dp[++k] = v[i];
idx[i] = k;
} else {
int pos = srch(v[i], k);
dp[pos] = v[i];
idx[i] = pos;
}
print(k);
}
int main()
{
read();
solve();
return 0;
}