Cod sursa(job #1403193)

Utilizator andreiblaj17Andrei Blaj andreiblaj17 Data 27 martie 2015 09:01:13
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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], D[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 (D[mid] < value && value <= D[mid+1])
            return mid;
        
        if (D[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];
        D[i] = inf;
    }
    
    sizeOfLS = 0;
    D[0] = -inf;
    
    for (int i = 1; i <= n; i++) {
        int poz = searchLS(0, sizeOfLS, A[i]);
        D[poz+1] = A[i];
        sizeOfLS = max(sizeOfLS, poz+1);
        
        V[poz+1].push_back(i);
    }
    
    fout << sizeOfLS << "\n";
    
    int index = V[sizeOfLS][V[sizeOfLS].size()-1];
    
    S.push(A[index]);
    
    for (int i = sizeOfLS - 1; i > 0; i--)
        for (int j = int(V[i].size()) - 1; j >= 0; j--)
            if (V[i][j] < index) {
                index = V[i][j];
                S.push(A[index]);
                break;
            }
    
    while (!S.empty()) {
        fout << S.top() << " ";
        S.pop();
    }
    
    fout << "\n";
    
    fin.close();
    fout.close();
    
    return 0;
}