Cod sursa(job #2210415)

Utilizator bigmixerVictor Purice bigmixer Data 6 iunie 2018 17:31:56
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 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,x,par[100005];
map<int,int>pop;
vector<int>ans;
vector<int>rs;
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,int z){
    z--;
    if(z>=1) afis(pop[y],z);
    rs.pb(y);
}

signed main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    cin >> n;
    cin >> x;
    n--;
    ans.pb(x);
    pop[x]=0;
    while(n--){
        cin >> x;
        if(!ans.size()){ ans.push_back(x); continue;}
        if(x>ans[ans.size()-1]){ pop[x]=ans[ans.size()-1]; ans.pb(x);  continue;}
        int ho=binsearch(0,ans.size()-1,x);
        ans[ho+1]=x;
        pop[x]=ans[ho];
    }
    afis(ans[ans.size()-1],ans.size());
    for(int i=0;i<rs.size()-1;i++){
        if(rs[i]>=rs[i+1]) return 0;
    }

    cout<<ans.size()<<endl;
    for(int i=0;i<rs.size();i++){
        cout<<rs[i]<<' ';
    }
}