Cod sursa(job #2280091)

Utilizator buhaidarius@gmail.comBuhai Darius [email protected] Data 10 noiembrie 2018 11:22:37
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

int a[100005], p[100005];
vector <int> e;
int n;

int cautBin(int x){
    int st=1, dr=(int)e.size()-1;
    int mij;
    while(st<=dr){
        if(st==dr)
            return st;
        mij = (st+dr)/2;
        if(e[mij] < x)
            st = mij + 1;
        else
            dr = mij;
        
    }
    return 0;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    
    scanf("%d\n", &n);
    
    e.push_back(0);
    
    for(int i=0;i<n;++i){
        scanf("%d", &a[i]);
        if(e.back() < a[i])
        {
            e.push_back(a[i]);
            p[i] = (int)e.size() - 1;
        }
        else{
            int poz = cautBin(a[i]);
            e[poz] = a[i];
            p[i] = poz;
        }
    }
    
    int l = (int)e.size() - 1;
    
    int pc = n-1;
    
    vector <int> sol;
    
    cout<<l<<"\n";
    
    for(int i=0;i<l;++i){
        for(int j=pc;j>=0;--j){
            if(p[j] == l-i){
                sol.push_back(a[j]);
                pc = j-1;
                break;
            }
        }
    }
    
    for(int i=l-1;i>=0;--i)
        cout<<sol[i]<<" ";
    
    return 0;
}