Cod sursa(job #2210572)

Utilizator bigmixerVictor Purice bigmixer Data 6 iunie 2018 23:59:15
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<bits/stdc++.h>
#define ll long long
#define sz size
#define pb push_back
#define er erase
#define in insert
#define fr first
#define sc second
#define mp make_pair
#define pi pair
#define _ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
#define rc(s) return cout<<s,0
using namespace std;


int n,a[100005],p[100005],l[100005];
vector<int>ans;

int binsearch(int l,int r,int y){
    int mid;
    while(l<=r){
        mid=l+(r-l)/2;
        if(ans[mid]<y) l=mid+1;
        else r=mid-1;
    }
    mid=l+(r-l)/2;
    if(ans[mid]>=y) mid--;
    return mid;


}

void afis(int y){
    if(p[y]) afis(p[y]);
    cout<<a[y]<<' ';
}

int main(){
  freopen("scmax.in","r",stdin);
  freopen("scmax.out","w",stdout);
    cin >> n;
    cin >> a[1];
    ans.pb(a[1]);
    p[1]=0;
    l[1]=1;
    for(int i=2;i<=n;i++){
        cin >> a[i];
        if(a[i]>ans[ans.size()-1]){ p[i]=l[ans.size()-1]; l[ans.size()]=i;  ans.pb(a[i]); continue;}
        int ho=binsearch(0,ans.size()-1,a[i]);
        l[ho+1]=i;
        p[i]=l[ho];
        ans[ho+1]=a[i];
    }
    cout<<ans.size()<<endl;
   afis(l[ans.size()-1]);
}