Cod sursa(job #1674627)

Utilizator razvandRazvan Dumitru razvand Data 4 aprilie 2016 19:38:33
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>

using namespace std;

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

int v[100003];
int s[100003];
int o[100003];
int b[100003];
int aib[100003];
int k;
int n;

int query(int val) {
    int rez = 0;
    for(int i = val; i > 0; i -= i&-i)
        if(aib[i] != 0)
            return i;
    return n;
}

int update(int val) {
    for(int i = val; i <= n; i += i&-i)
        aib[i]++;
}

int main() {

    in >> n;

    for(int i = 1; i <= n; i++) {
        in >> v[i];
        s[i] = v[i];
    }

    sort(s+1, s+n+1);

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

    int M = 0;
    int MI = 0;

    for(int i = 1; i <= n; i++) {
        int q = query(v[i]-1)+1;
        o[i] = o[q]+1;
        b[i] = q;
        if(o[i] > M) {
            M = o[i];
            MI = i;
        }
        update(v[i]);
    }

    stack<int> st;
    int P = MI;

    while(P != n+1) {
        st.push(P);
        P = b[P];
    }

    out << M << '\n';
    while(!st.empty()) {
        out << s[st.top()-1] << " ";
        st.pop();
    }

    return 0;
}