Cod sursa(job #2778364)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 1 octombrie 2021 10:50:56
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[100005];
int cautare(int v[], int st, int dr, int x)
{
    int mij;
    while(dr - st > 1){
        mij = st + (dr - st) / 2;
        if (v[mij] >= x){
            dr = mij;
        }else{
            st = mij;
        }
    }
    return dr;
}
void Scmax(int N, int v[])
{
    int tail[N], p[N];
    memset(tail, 0, sizeof(tail));
    int len = 1;
    tail[0] = v[0];
    p[0] = 1;
    for (int i=1;i<N;i++){
        if (v[i] < tail[0]){
            tail[0] = v[i];
            p[i] = 0;
        }else if (v[i] > tail[len - 1]){
            p[i] = len;
            tail[len ++] = v[i];
        }else{
            int pos = cautare(tail, -1, len - 1, v[i]);
            tail[pos] = v[i];
            p[i] = pos;
        }
    }
    fout << len << '\n';

    int ans[N], j = N - 1;
    for (int i=len-1;i>=0;i--){
        while(p[j] != i)
            j --;
        ans[i] = v[j];
    }
    for (int i=0;i<len;i++){
        fout << ans[i] << ' ';
    }
    fout << '\n';

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

    Scmax(n, a);
    return 0;
}