Pagini recente » Cod sursa (job #2254873) | Cod sursa (job #294655) | Cod sursa (job #679590) | Cod sursa (job #644349) | Cod sursa (job #1974353)
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 100005;
const int INF = 0x3f3f3f3f;
int DP[Nmax];
int dad[Nmax];
int index[Nmax];
int val[Nmax];
int lg = 1;
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
ios::sync_with_stdio(false);
memset(DP,INF,sizeof(DP));
int N;
scanf("%d", &N);
for(int i = 1; i <= N; ++i)
scanf("%d", &val[i]);
for(int i = 1; i <= N; ++i) {
int pz = lower_bound(DP + 1, DP + lg + 1, val[i]) - DP;
DP[pz] = val[i];
dad[i] = index[pz - 1];
index[pz] = i;
if(pz == lg)
++lg;
}
printf("%d\n", lg - 1);
int crt = index[lg - 1];
vector<int> sol;
while(crt != 0) {
sol.push_back(val[crt]);
crt = dad[crt];
}
reverse(sol.begin(), sol.end());
for(auto it : sol)
printf("%d ",it);
return 0;
}