Cod sursa(job #2458877)

Utilizator CharacterMeCharacter Me CharacterMe Data 21 septembrie 2019 18:12:02
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
int n, sol, i, j, k;
int list[100001], minv[100001], last[100001];
void read();
void solve();
void write();
void add(int val);
void back(int val);
int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    read();
    solve();
    write();
    fclose(stdin);
    fclose(stdout);
    return 0;
}
void read(){
    scanf("%d", &n);
    for(i=1; i<=n; ++i) scanf("%d", &list[i]);
}
void solve(){
    minv[1]=1; sol=1;
    for(i=2; i<=n; ++i) add(list[i]);
}
void write(){
    printf("%d\n", sol);
    back(minv[sol]);
    printf("%d", list[minv[sol]]);
}
void add(int val){
    int l=1, r=sol, m;
    if(list[minv[sol]]<val){
        minv[++sol]=i;
        last[i]=minv[sol-1];
        return;
    }
    while(l<r){
        m=(l+r)/2;
        if(list[minv[m]]>=val && val>list[minv[m-1]]) break;
        else if(val<=list[minv[m]])r=m-1;
        else l=m+1;
    }
    if(l==r) m=l;
    if(list[minv[m]]>list[i]) {minv[m]=i; last[i]=minv[m-1];}
}
void back(int val){
    if(!last[val]) return;
    back(last[val]);
    printf("%d ", list[last[val]]);
}