Cod sursa(job #2902057)

Utilizator Frant_IoanaFrant Ioana Frant_Ioana Data 15 mai 2022 12:09:26
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n, v[100001], d[100001], k, p[100001], I[100001];

int bs(int x){
    int st = 1, dr = k, mij, poz = -1;

    while(st <= dr){
        mij = (st + dr) / 2;

        if(d[mij] > x)
            dr = mij - 1, poz = mij;
        else if(d[mij] <= x)
            st = mij + 1;
    }

    return poz;
}

int main(){
    fin >> n;
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    
    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
            d[bs(v[i])] = v[i], p[i] = bs(v[i]);
    }

    fout << k << '\n';

    int j = n;
    for(int i = k; i >= 1; i--){
        while(p[j] != i)
            j--;
        I[i] = v[j];
    }

    sort(I + 1, I + k + 1);

    for(int i = 1; i <= k; i++)
        fout << I[i] << ' ';
}