Cod sursa(job #1674734)

Utilizator razvandRazvan Dumitru razvand Data 4 aprilie 2016 20:31:41
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <limits.h>

using namespace std;

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

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

int query(int val) {
    int M = 0;
    for(int i = val; i > 0; i -= i&-i)
        if(o[M] < o[aib[i]])
            M = aib[i];
    return M;
}

int update(int val, int ind) {
    for(int i = val; i <= n; i += i&-i)
        if(o[ind] > o[aib[i]])
            aib[i] = ind;
}

int main() {

    in >> n;

    for(int i = 1; i <= n; i++) {
        in >> v[i];
        s[i] = v[i];
        t[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 = n; i >= 1; i--) {
        int q = query(n+1-(v[i]+1));
        o[i] = o[q]+1;
        b[i] = q;
        if(o[i] > M) {
            M = o[i];
            MI = i;
        }
        update(n+1-v[i], i);
    }

    out << M << '\n';
    while(MI != 0) {
        out << t[MI] << " ";
        MI = b[MI];
    }

    return 0;
}