Cod sursa(job #2867892)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 10 martie 2022 16:53:21
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define NMAX 100005
int n, a[NMAX];
int cautare(const int v[], int st, int dr, int x)
{
    int mij;
    while(dr - st > 1){
        mij = st + (dr - st) / 2;
        if (v[mij] < x){
            st = mij;
        }else{
            dr = mij;
        }
    }
    return dr;
}
void Scmax(int N, int v[])
{
    int D[NMAX], p[NMAX];
    memset(D, 0, sizeof(D));
    int k = 1, nr;
    D[k] = v[1];
    p[1] = 1;
    for (int i=2;i<=n;i++){
        if (v[i] > D[k]){
            D[++k] = v[i];
            p[i] = k;
        }else{
            nr = cautare(D, 1, k, v[i]);
            D[nr] = v[i];
            p[i] = nr;
        }
    }
    int sir[NMAX];
    int j=n;
    for (int i=k;i>=1;--i){
        while(p[j] != i)
            j --;
        sir[i] = j;
    }

    fout << k << '\n';
    for (int i=1;i<=k;i++){
        fout << v[sir[i]] << ' ';
    }

}
int main() {
    fin >> n;
    for (int i=1;i<=n;i++){
        fin >> a[i];
    }

    Scmax(n, a);
    return 0;
}