Cod sursa(job #2499798)

Utilizator bogdan_modoleaBogdan Modolea bogdan_modolea Data 26 noiembrie 2019 19:27:26
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
#define NMAX 100001
using namespace std;

string file="scmax";
ifstream fin(file+".in");
ofstream fout(file+".out");

int n,maxi,cnt;
int a[NMAX],L[NMAX],check[NMAX];
int sol[NMAX];

int cb(int st,int dr,int i)
{
    int m;
    while(st<=dr){
        m=(st+dr)>>1;
        if(a[i]>check[m]) st=m+1;
        else dr=m-1;
    }
    return st;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int i;
    fin>>n;
    for(i=1;i<=n;i++) fin>>a[i];
    L[1]=1; check[1]=a[1]; maxi=1;
    for(i=2;i<=n;i++){
        int poz,dr;
        dr=maxi;
        poz=cb(1,dr,i);
        if(poz==maxi+1) maxi++;
        check[poz]=a[i];
        L[i]=poz;
    }
    fout<<maxi<<"\n";
    int curr=INT_MAX;
    for(i=n;i>=1;i--){
        if(L[i]==maxi&&a[i]<curr){
            sol[++cnt]=a[i];
            maxi--;
            curr=a[i];
        }
    }
    for(i=cnt;i>=1;i--) fout<<sol[i]<<" ";
    return 0;
}