Cod sursa(job #2622461)

Utilizator Sho10Andrei Alexandru Sho10 Data 1 iunie 2020 12:44:16
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#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[k]]>dp[mx]){
        mx=bit[k];
    }
    k-=(k&-k);
}
return mx;
}
ll update(ll x,ll indx){
for(ll i=x;i<=n;i+=(i&-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]<<' ';
}
}