Cod sursa(job #2274787)

Utilizator GarboteialexGarbotei Alex Garboteialex Data 2 noiembrie 2018 15:00:05
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>

using namespace std;

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

const int DM = 1e5 + 1e2;

long long n,v[DM];
long long dp[DM],p[DM],l, ind;

int bin(int x, int lo, int hi)
{
    int mid;
    
    while(lo < hi)
    {
        mid = (lo + hi) / 2;
        
        if(v[dp[mid]] <= x) lo = mid + 1;
        else hi = mid;
    }
    
    mid = (lo + hi) / 2;
    if(v[dp[mid]] >= x) mid--;
    
    return mid;
}

void afisare(int i)
{
    if(p[i] > 0) afisare(p[i]);
    fout << v[i] << " ";
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++) fin >> v[i];
    
    dp[0] = 0;
    dp[1] = 1;
    l = 1;
    ind = 1;
    
    if(n == 1) {
        fout << "1" << '\n' << v[1];
    } else {
    
        for(int i = 2; i <= n; i++)
        {
            int poz = bin(v[i], 0, l);
            dp[poz + 1] = i;
            p[i] = dp[poz];
            
            if(poz + 1 > l)
            {
                l = poz + 1;
                ind = i;
            }
        }
    
    fout << l << '\n';
    afisare(ind);
    }
}