Cod sursa(job #897845)

Utilizator toranagahVlad Badelita toranagah Data 27 februarie 2013 22:40:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");
typedef unsigned int uint32;

void find_lis(vector<int> &v, vector<int> &lis);

int main() {
    int N;
    vector<int> v, lis;

    fin >> N;
    for (int i = 0, x; i < N; ++i) {
        fin >> x;
        v.push_back(x);
    }

    find_lis(v, lis);
    fout << lis.size() << '\n';
    for (uint32 i = 0; i < lis.size(); ++i) {
        fout << v[lis[i]] << ' ';
    }
    return 0;
}

void find_lis(vector<int> &v, vector<int> &lis) {
    vector<int> p(v.size());
    lis.push_back(0);

    for (uint32 i = 1; i < v.size(); ++i) {
        if (v[i] > v[lis.back()]) {
            p[i] = lis.back();
            lis.push_back(i);
            continue;
        }

        uint32 lo = 0, hi = lis.size() - 1;
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            if (v[i] > v[lis[mid]]) lo = mid + 1;
            else hi = mid;
        }

        if (v[i] < v[lis[lo]]) {
            if (lo > 0) p[i] = lis[lo - 1];
            lis[lo] = i;
        }
    }
    
    for (uint32 i = lis.size(), j = lis.back(); i--; j = p[j]) lis[i] = j;
}