Cod sursa(job #1461924)

Utilizator lflorin29Florin Laiu lflorin29 Data 16 iulie 2015 17:17:51
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cassert>
#define ft first
#define sd second
#define forn(i, n) for (int i = 0; i < (int)(n); i++)
#define pb push_back
using namespace std;

const int kp = 100003;
vector <int> v;
int n;
int Max, pos;
int prv[kp], aib[kp], here[kp];

void update (int poz, int value){
    for (; poz <= n; poz += poz & -poz)
        aib[poz] = max(aib[poz], value);
}

int query (int poz){
    int lr = 0;
    for (; poz ; poz -= poz & -poz)
        lr = max(lr, aib[poz]);
    return lr;
}

int main(){
    ifstream in ("scmax.in");
    ofstream out ("scmax.out");
    in >> n;
    forn(i, n)
        in >> prv[i], v.pb(prv[i]);
    sort(v.begin(), v.end());
    v.resize( unique(v.begin(), v.end()) - v.begin() );
    forn(i, n){
        prv[i] = lower_bound(v.begin(), v.end(), prv[i]) - v.begin() + 1;
        assert(prv[i]);}
    forn(i, n){
        here[i] = query(prv[i] - 1) + 1;
        update(prv[i] , here[i]);
        if (here[i] > Max)
           Max = here[i], pos = i;
    }
    vector <int> FT;
    for (; pos >= 0 ; ){
            FT.pb(v[prv[pos] - 1]);
            int k;
            for (k=pos-1; k>=0; -- k)
               if (prv[k] < prv[pos] && here[k] == here[pos] - 1) break;
            pos = k;
    }
    out << Max << "\n";
    reverse(FT.begin(), FT.end());
    for (const auto it : FT)
        out << it << " ";
    return 0;
}