Cod sursa(job #2497604)

Utilizator OvidRata Ovidiu Ovid Data 22 noiembrie 2019 22:20:41
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in"); ofstream fout("scmax.out"); 

int n, c[1000010], a[1000010], dp[1000010], sz, k, p[100010];


void print_seq(int m){
int c=m; int temp=1000000000;
string res;
    for(int i=n-1; i>=0; --i){

        if(dp[i]==c && a[i]<temp){c--; res=to_string(a[i])+' '+res; temp=a[i];}
    }

cout<<res;
}





int binary_search(int l,  int r, int e){
int m=(l+r)/2;

if(e>c[m]){return binary_search(m+1, r, e);}
else{
    if(e<=c[m] && e>c[m-1]){return m;}
    else{return binary_search(l, m-1, e);}
}


}


int main(){
    cin>>n;
    cin>>a[0];
    c[1]=a[0];
    dp[0]=1;
    sz=1;
    for(int i=1; i<n; i++){
cin>>a[i];

       if(a[i]>c[sz]){
           c[sz+1]=a[i];
           dp[i]=sz+1;
           sz++;
       }
      else{

          if(a[i]<c[1]){
             c[1]=a[i];
             dp[i]=1;
          }
         else{
          k=binary_search(1, sz, a[i]);
          c[k]=a[i];
          dp[i]=k; 
         }
      }


    }
    int m=0;
    for(int i=0; i<n; i++){if(dp[i]>m){m=dp[i];}}
    cout<<m<<endl;
    print_seq(m);

    return 0;
}