Pagini recente » Cod sursa (job #1614353) | Cod sursa (job #1146853) | Cod sursa (job #202834) | Cod sursa (job #2481488) | Cod sursa (job #2622458)
#include <bits/stdc++.h> //Andrei Alexandru a.k.a Sho10
#define ll long long
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define all(a) (a).begin(), (a).end()
#define sz size
#define f first
#define s second
#define pb push_back
#define er erase
#define in insert
#define mp make_pair
#define pi pair
#define rc(s) return cout<<s,0
#define endl '\n'
#define mod 1000000007
#define modul 998244353
#define PI 3.14159265359
#define CODE_START ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
ll n,bit[200005],a[200005],l[200005],rs[200005],u[200005],dp[200005];
ll query(ll x){
ll mx=0;
ll k=x;
while(k>=1){
if(dp[bit[x]]>dp[mx]){
mx=bit[x];
}
k-=k^(k-1)&k;
}
return mx;
}
ll update(ll x,ll indx){
for(ll i=x;i<=n;i+=i^(i-1)&i){
if(dp[indx]>dp[bit[i]]){
bit[i]=indx;
}
}
}
int32_t main(){
CODE_START;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
rs[i]=l[i]=a[i];
}
sort(l+1,l+n+1);
ll m=1;
for(ll i=2;i<=n;i++)
{
if(l[i]!=l[m]){
l[++m]=l[i];
}
}
for(ll i=1;i<=n;i++)
{
a[i]=lower_bound(l+1,l+m+1,a[i])-l;
}
for(ll i=1;i<=n;i++)
{
u[i]=query(a[i]-1);
dp[i]=dp[u[i]]+1;
update(a[i],i);
}
ll ans=0;
for(ll i=1;i<=n;i++){
if(dp[ans]<dp[i]){
ans=i;
}
}
cout<<dp[ans]<<endl;
ll h=0;
for(ll i=ans;i;i=u[i]){
l[++h]=rs[i];
}
for(ll i=h;i;i--)
{
cout<<l[i]<<' ';
}
}