Pagini recente » Cod sursa (job #519504) | Cod sursa (job #517460) | Cod sursa (job #2674082) | Cod sursa (job #514642) | Cod sursa (job #3304486)
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int dp[N], v[N], parent[N];
int bin(int left, int right, int val){
int ans=right;
while (left<=right){
int mid=(left+right)/2;
if (v[dp[mid]]<val){
ans=mid;
left=mid+1;
}
else{
right=mid-1;
}
}
return ans;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
memset(dp, (1<<6)-1, sizeof(dp));
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;cin>>n;
for (int i=1;i<=n;i++){
cin>>v[i];
}
dp[0]=0;
int ans=0;
for (int i=1;i<=n;i++){
int poz=bin(0, ans, v[i]);
if (v[dp[poz]]<v[i] && (dp[poz+1]>1e9 || v[dp[poz+1]]>v[i])){
dp[poz+1]=i;
parent[i]=dp[poz];
ans=max(ans, poz+1);
}
}
int node=dp[ans];
vector<int> path;
while (node!=0){
path.push_back(node);
node=parent[node];
}
cout<<ans<<'\n';
for (int i=path.size()-1;i>=0;i--){
cout<<v[path[i]]<<' ';
}
return 0;
}