Cod sursa(job #2850403)

Utilizator XRobertoHordoan Roberto Sergiu XRoberto Data 16 februarie 2022 18:57:57
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;

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

int n;
vector<int> v;
vector<int> d;
int k = 1;

void read() {
    fin >> n;
    v = vector<int>(n + 1), d = vector<int>(n + 1);
    for(int i = 1; i <= n; i++)
        fin >> v[i];
}

int query(int x) {
    int p = k + 1; //position of previous element that was lower than x
    int st = 1, dr = k;
    int mij;
    while(st <= dr) {
        mij = (st + dr) / 2;
        if(d[mij] > x)
            p = mij, dr = mij - 1;
        else
            st = mij + 1;
    }
    return p;
}

void build() {
    int j;
    d[1] = v[1];
    for(int i = 2; i <= n; i++) {
        if(v[i] == d[k]) //save some time
            continue;
        if(v[i] > d[k])
            k++, d[k] = v[i];
        else {
            j = query(v[i]);
            d[j] = v[i];
        }
    }
}

void print() {
    fout << k << "\n";
    for(int i = 1; i <= k; i++)
        fout << d[i] << " ";
}

void fclose() {
    fin.close(), fout.close();
}

int main() {
    read();
    build();
    print();
    fclose();
    return 0;
}