Cod sursa(job #3340173)

Utilizator st3fann_24Nica Stefan st3fann_24 Data 12 februarie 2026 14:10:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

std::ifstream f("scmax.in");
std::ofstream g("scmax.out");

int n, best[200005], lgbest, poz[200005], sol[200005];
int cb(int dr, int x){
    int st = 1;
    while(st <= dr){
        int mid = (st + dr) / 2;
        if(best[mid] == x)
            return mid;
        else if(best[mid] < x)
                st = mid + 1;
                else dr = mid - 1;
    }
    return st;
}
int main(){
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);
    std::cout.tie(NULL);

    f >> n;
    std::vector<int> v(n + 3, 0);
    for(int i = 1; i <= n; ++i)
        f >> v[i];
    best[1] = v[1];
    lgbest = 1;
    poz[1] = lgbest;
    for(int i = 2; i <= n; ++i){
        if(best[lgbest] < v[i])
            best[++ lgbest] = v[i], poz[i] = lgbest;
        else{
            int pz = cb(lgbest, v[i]);
            best[pz] = v[i];
            poz[i] = pz;
        }
    }
    g << lgbest << '\n';
    for(int i = lgbest, j = n; i and j; --j){
        if(i == poz[j]){
            sol[i] = v[j], --i;
        }
    }
    for(int i = 1; i <= lgbest; ++i)
        g << sol[i] << ' ';
    return 0;
}