Cod sursa(job #2867901)

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