Cod sursa(job #1310245)

Utilizator somuBanil Ardej somu Data 6 ianuarie 2015 16:56:27
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#define nmax 100005
#define inf 1<<30

using namespace std;

int n;
int sizeOfLS;
int A[nmax], LS[nmax];
vector <int> V[nmax];
stack <int> S;

int searchLS(int st, int dr, int value) {
    int mid;
    while (st < dr) {
        mid = (st + dr) >> 1;
        
        if (LS[mid] < value && value <= LS[mid+1])
            return mid;
        
        if (LS[mid] < value)
            st = mid + 1;
        else
            dr = mid - 1;
    }
    
    return dr;
    
}

int main() {
    
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    
    fin >> n;
    
    for (int i = 1; i <= n; i++) {
        fin >> A[i];
        LS[i] = inf;
    }
    
    sizeOfLS = 0;
    LS[0] = -inf;
    
    for (int i = 1; i <= n; i++) {
        int poz = searchLS(0, sizeOfLS, A[i]);
        LS[poz+1] = A[i];
        sizeOfLS = max(sizeOfLS, poz+1);
    
        V[poz+1].push_back(A[i]);
    }
    
    fout << sizeOfLS << "\n";
    
    int val = V[sizeOfLS][V[sizeOfLS].size()-1];
    
    S.push(val);
    
    for (int i = sizeOfLS - 1; i > 0; i--)
        for (int j = V[i].size() - 1; j >= 0; j--)
            if (V[i][j] < val) {
                S.push(V[i][j]);
                val = V[i][j];
                break;
            }
    
    while (!S.empty()) {
        fout << S.top() << " ";
        S.pop();
    }
    
    fout << "\n";
    
    fin.close();
    fout.close();
    
    return 0;
}