Cod sursa(job #2029132)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 29 septembrie 2017 14:57:43
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#define zeros(x) (x & -x)
#define MAX 100005
using namespace std;

int n, aib[MAX], a[MAX], l[MAX], v[MAX], d[MAX], prev[MAX];

void update(int pos, int val) {
    for(int i = pos; i <= n; i += zeros(i))
        if(d[aib[i]] < d[val])
            aib[i] = val;
}

int query(int pos) {
    int res = 0;
    for(int i = pos; i > 0; i -= zeros(i))
        if(d[res] < d[aib[i]])
            res = aib[i];
    return res;
}

int main() {
    ifstream f("scmax.in");
    ofstream g("scmax.out");
    f >> n;
    for(int i = 1; i <= n; ++i)
        f >> a[i];

    l[1] = a[1];
    int h = 1;
    for(int i = 2; i <= n; ++i)
        if(a[i] != l[h])
            l[++h] = a[i];
    sort(l + 1, l + h + 1);

    for(int i = 1; i <= n; ++i)
        v[i] = lower_bound(l + 1, l + h + 1, a[i]) - l;

    for(int i = 1; i <= n; ++i) {
        prev[i] = query(v[i] - 1);
        d[i] = d[prev[i]] + 1;
        update(v[i], i);
    }

    int res = 0;
    for(int i = 1; i <= n; ++i)
        if(d[res] < d[i])
            res = i;
    g << d[res] << "\n";
    vector<int> vres;
    while(res) {
        vres.push_back(a[res]);
        res = prev[res];
    }
    for(int i = vres.size() - 1; i >= 0; --i)
        g << vres[i] << " ";
    return 0;
}