Cod sursa(job #2523763)

Utilizator Vlad.Vlad Cristian Vlad. Data 14 ianuarie 2020 18:43:37
Problema Subsir crescator maximal Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
#define MAXN 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
struct el {
    int val;
    long poz;
};
el v[MAXN + 5];
int aib[MAXN + 5];
int N;
vector<long> sir;
bool comp(el a, el b) {
    if (a.val == b.val) {
        return a.poz > b.poz;
    }
    return a.val < b.val;
}
void read() {
    fin >> N;
    for (int i = 1; i <= N; ++i) {
        fin >> v[i].val;
        v[i].poz = i;
    }
}
void update(int poz, int val) {
    for (int i = poz; i <= MAXN; i += i & -i) {
        aib[i] = max(aib[i], val);
    }
}
int query(int poz) {
    int maxi = 0;
    for (int i = poz; i > 0; i -= i & -i) {
        maxi = max(maxi, aib[i]);
    }
    return maxi;
}
int main()
{
    read();
    sort(v + 1, v + N + 1, comp);
    for (int i = 1; i <= N; ++i) {
        int q = query(v[i].poz - 1);
        if (q + 1 > query(MAXN)) {
            sir.push_back(v[i].val);
        }
        update(v[i].poz, q + 1);
    }
    fout << query(MAXN) << "\n";
    for (int i = 0; i < sir.size(); ++i) {
        fout << sir[i] << " ";
    }
    return 0;
}