Cod sursa(job #2080267)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 2 decembrie 2017 17:57:11
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#define NMAX 100005
#define lsb(x) (x & (-x))

using namespace std;

int a[NMAX], n;

vector<pair<int, int>> sort_v;
int norm_v[NMAX];

int p[NMAX], l[NMAX];

pair<int, int> aib[NMAX];
int dim;

void update(int pos, int pos_v) {

    for (int i = pos; i <= dim; i += lsb(i)) {

        if (l[pos_v] > aib[i].first)
            aib[i] = make_pair(l[pos_v], pos_v);
    }
}

pair<int, int> query(int pos) {

    pair<int, int> max_v = make_pair(0, 0);

    for (int i = pos; i > 0; i -= lsb(i)) {

        if (aib[i].first > max_v.first)
            max_v = aib[i];
    }

    return max_v;
}

void read() {

    ifstream in("scmax.in");
    in >> n;

    for (int i = 1; i <= n; ++i) {

        in >> a[i];
        sort_v.push_back(make_pair(a[i], i));
    }

    in.close();
}

ofstream out("scmax.out");

void print(int n) {

    if (n != 0) {

        print(p[n]);
        out << a[n] << " ";
    }
}

int main() {

    read();
    sort(sort_v.begin(), sort_v.end());

    dim = 1;
    norm_v[sort_v[0].second] = dim;

    for (unsigned int i = 1; i < sort_v.size(); i++) {

        if (sort_v[i].first > sort_v[i - 1].first)
            dim++;
        norm_v[sort_v[i].second] = dim;
    }

    pair<int, int> res;
    int length = 0, pos = 0;

    for (int i = 1; i <= n; i++) {

        res = query(norm_v[i] - 1);
        l[i] = res.first + 1;
        p[i] = res.second;

        update(norm_v[i], i);

        if (l[i] > length) {

            length = l[i];
            pos = i;
        }
    }

    out << length << "\n";
    print(pos);
    out.close();
    return 0;
}