Pagini recente » Cod sursa (job #1876098) | Cod sursa (job #537633) | Cod sursa (job #3277691) | Cod sursa (job #890474) | Cod sursa (job #2964336)
#include <fstream>
#include <algorithm>
#include <unordered_map>
#include <vector>
using namespace std;
const int MAX = 1e5 + 2;
const int inf = 2e9 + 1;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
unordered_map <long long,long long> um;
vector<long long>ans;
long long dp[MAX], v[MAX] , n , a;
// dp[i] = numarul minim cu care s-ar termina o secventa de lungime i;
int main()
{
cin >> n;
dp[0] = 0;
int maxim = 0;
for(int i = 1 ; i <= n ; i++){
dp[i] = inf;
}
for(int i = 1 ; i <= n ; i++){
cin >> v[i];
a = v[i];
int x = upper_bound(dp,dp+1+n,a) - dp;
if( a < dp[x] && a > dp[x-1]){
dp[x] = a;
um[a] = dp[x-1];
if( x <= n ) maxim = max(maxim,x);
}
}
cout << maxim << '\n';
int x = dp[maxim];
while(um[x]){
ans.push_back(x);
x = um[x];
}
ans.push_back(x);
reverse(ans.begin(),ans.end());
for(auto i: ans) cout << i << ' ';
return 0;
}