Cod sursa(job #2874749)

Utilizator ililogIlinca ililog Data 20 martie 2022 10:28:56
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
using namespace std;
#include<bits/stdc++.h>

int N;
int v[100001], cb[100001], ts;
int poz[100001], pre[100001];

int bin_search(int val) {
    
    int pw = 1;
    
    while (pw <= ts) {
        pw *= 2;
    }
    
    pw /= 2;
    
    int pos = 0;
    
    while (pw) {
        if (pos + pw <= ts) {
            if (cb[pos+pw] < val) {
                pos += pw;
            } 
        }
        
        pw /= 2;
    }
    
    return pos;
}

void solve(int pz) {
    if (pz == 0) return;
    
    solve(pre[pz]);
    
    cout << v[pz] << ' ';
}

int main() {
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    
    scanf("%d\n", &N);
    
    for (int i = 1; i<=N; i++) {
        scanf("%d", &v[i]);
    }
    
    int mxpos = 1;
    
    for (int i = 1; i<=N; i++) {
        int pos = bin_search(v[i]);
        
        if (pos == ts) {
            cb[++ts] = v[i];
            poz[ts] = i;
            pre[i] = poz[pos];
            mxpos = i;
        } else {
            pre[i] = poz[pos];
            if (cb[pos+1] > v[i]) {
                cb[pos+1] = v[i];
                poz[pos+1] = i;
            }
        }
    }
    
    cout << ts << '\n';
    
    solve(mxpos);
    
    cout << '\n';
    
    return 0;
}