Cod sursa(job #2781447)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 9 octombrie 2021 16:33:05
Problema Subsir crescator maximal Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100005;
const int INF = (1<<29);
int n,a[NMAX+10],afis[NMAX+10];
int v[NMAX+10],pre[NMAX+10];
int caut_bin(int val){
    int st=1,dr=NMAX-5,rasp;
    while(st<=dr){
        int mij=(st+dr)/2;
        if(val<=a[v[mij]]){
            dr=mij-1;
            rasp=mij;
        } else st=mij+1;
    }
    return rasp;
}
void citire(){
    fin >> n;
    for(int i=1;i<=n;i++) fin >> a[i];
    for(int i=1;i<=NMAX-4;i++) v[i]=n+1;
    a[n+1]=INF;
}
void solve(){
    for(int i=1;i<=n;i++){
        int poz=caut_bin(a[i]);
        v[poz]=i;
        pre[i]=v[poz-1];
    }
    int rasp=1;
    for(int i=1;i<=n+1;i++){
        if(v[i]==n+1){
            rasp=i-1;
            break;
        }
    }
    fout << rasp << '\n';
    int ind=v[rasp],k=0;
    while(ind!=0){
        afis[++k]=ind;
        ind=pre[ind];
    }
    for(int i=rasp;i>=1;i--) fout << a[afis[i]] << ' ';
}
int main()
{
    citire();
    solve();
    return 0;
}