Cod sursa(job #2150882)

Utilizator Hidden.bdBurlacu Doru Hidden.bd Data 3 martie 2018 20:59:12
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n, v[100002], dp[100002], poz[100002], a[100002], maxI = 1, maxx;
vector<int> afis;

int lim = 1;
int cb( int x ){
    int st = 0, dr = lim + 1, mid;
    while( dr - st > 1 ){
        mid = st + ( dr - st ) / 2;
        if( a[mid] < x ) st = mid;
        else dr = mid;
    }
    return st;
}

int main()
{
    
    fin >> n;
    
    for( int i = 1 ; i <= n ; ++i ){
        fin >> v[i];
    }
    
    dp[1] = 1;
    a[1] = v[1];
    poz[1] = 0;
    for( int i = 2 ; i <= n ; ++i ){
        poz[i] = cb(v[i]);
        dp[i] = cb(v[i]) + 1;
        a[dp[i]] = v[i];
        if( dp[i] > lim ) lim = dp[i];
        
        if( dp[i] > maxx ){
            maxx = dp[i];
            maxI = i;
        }
    }
    fout << maxx << "\n";
    
    for( int i = 1 ; i <= n ; ++i ){
        //fout << dp[i] << " ";
    }
    for( int i = maxI ; i ; i = poz[i] ){
        afis.push_back(v[i]);
    }
    
    for( int i = afis.size() - 1 ; i >= 0 ; --i ){
        fout << afis[i] << " ";
    }
    
    return 0;
}