Pagini recente » Cod sursa (job #1087020) | Cod sursa (job #2427685) | Cod sursa (job #2644205) | Cod sursa (job #554670) | Cod sursa (job #3030811)
#include <bits/stdc++.h>
using namespace std;
const int nmx = 1e5 + 5;
const int inf = 1e17;
int a[nmx];
int dp[nmx],t[nmx],id[nmx];
#define cin fin
#define cout fout
ifstream fin("scmax.in");
ofstream fout("scmax.out");
// dp[i] - cel mai mic element cu care se termina subsirul crescator de lungime i
// dp[i] =
int main(){
int n;
cin >> n;
for(int i=1;i<=n;i++)
cin >> a[i],dp[i]=inf;
dp[0] = -inf;
for(int i=1;i<=n;i++){
int idx = upper_bound(dp,dp+1+n,a[i])-dp;
if(dp[idx]>a[i] && a[i]>dp[idx-1]){
dp[idx]=a[i];
id[idx]=i;
t[id[idx]]=id[idx-1];
}
}
int it = 0,sz=0;
for(int i=1;i<=n;i++)
if(dp[i]!=inf){
it = id[i];
sz=i;
}
cout << sz << "\n";
vector<int> p;
while(it){
//cout << a[i]
p.push_back(a[it]);
it = t[it];
}
reverse(p.begin(),p.end());
for(int c : p)
cout << c << " ";
}