Cod sursa(job #3191370)

Utilizator Mihai00700Lalallalalal Mihai00700 Data 9 ianuarie 2024 15:57:55
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;
void setIO(string name = "") {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    if (!name.empty()) {
        string inFileName = name + ".in";
        string outFileName = name + ".out";

        freopen(inFileName.c_str(), "r", stdin);
        freopen(outFileName.c_str(), "w", stdout);
    }
}

const int NMAX = 1e5;

int v[NMAX], poz[NMAX], rez[NMAX];

int main(){
	setIO("scmax");
	int n, i, pp, dr, st, nr;
    cin>>n;
    for(i = 0;i<n;i++){
        cin>>v[i];
    }
    rez[0] = v[0];
    poz[0] = 0;
    nr = 0;
    for(i = 1;i<n;i++){
        st = 0;
        dr = nr;
        pp = -1;
        while(st <= dr){
            int mij = (st + dr) / 2;
            if(rez[mij] < v[i]){
                st = mij + 1;
            }else{
                pp = mij;
                dr = mij - 1;
            }
        }
        if(pp == -1){
            nr++;
            rez[nr] = v[i];
            poz[i] = nr;
        }else{
            rez[pp] = v[i];
            poz[i] = pp;
        }
    }
    cout<<nr + 1<<"\n";
    int cnr = nr;
    for(i = n - 1;i>=0;i--){
        if(poz[i] == nr){
            rez[nr] = v[i];
            nr--;
        }
    }
    for(i = 0;i<=cnr;i++){
        cout<<rez[i]<<" ";
    }
    cout<<"\n";
    return 0;
}