Cod sursa(job #2139196)

Utilizator AronZekAron Jinga AronZek Data 22 februarie 2018 11:05:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#define NMAX 1000003

using namespace std;

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

    int n, v[NMAX], best[NMAX], p[NMAX], maxim, k, L[NMAX], nr;

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

    int caut(int x){
        int p, u, m;
        p=0; u = nr; m = (p+u)/2;
        while(p <= u){
            if(v[L[m]] < x && v[L[m+1]] >= x) return m;
            else if(v[L[m+1]] < x){
                p = m+1;
                m = (p + u)/2;
            }
            else{
                u = m-1;
                m = (p + u)/2;
            }
        }
        return nr;
    }
int main(){
    int i, j, poz;
    nr = 1;

    fin >> n ;
    for(i = 1; i <= n; i++)
        fin >> v[i];
    best[1] = L[1] = 1;
    L[0] = 0;

    for(i = 2; i <= n ; i++){
        poz = caut(v[i]);
        p[i]= L[poz];
        best[i] = poz + 1;
        L[poz + 1]= i;
        if(nr < poz + 1) nr = poz + 1;
    }

    maxim = 0;
    poz = 0;

    for(i = 1; i <= n; i++)
    if(maxim < best[i]){
        if(maxim < best[i]){
            maxim = best[i];
            poz = i;
        }
    }
        fout << maxim << endl;
        afis(poz);
return 0;
}