Cod sursa(job #1167957)

Utilizator Athena99Anghel Anca Athena99 Data 6 aprilie 2014 13:21:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>

using namespace std;

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

const int nmax= 100000;

int v[nmax+1], x[nmax+1], p[nmax+1], ans[nmax+1];

int main(  ) {
    int n, n2, k= 0;
    fin>>n;
    for ( n2= 1; 2*n2<=n; n2*= 2 ) ;
    for ( int i= 1; i<=n; ++i ) {
        fin>>v[i];

        if ( v[x[k]]<v[i] ) {
            p[i]= x[k], x[++k]= i;
        } else {
            int sol= 0;
            for ( int step= n2; step; step/= 2 ) {
                if ( sol+step<=k && v[x[sol+step]]<v[i] ) {
                    sol+= step;
                }
            }

            p[i]= x[sol], x[sol+1]= i;
        }
    }

    fout<<k<<"\n";
    for ( int i= x[k], a= k; i!=0; i= p[i], --a ) {
        ans[a]= v[i];
    }
    for ( int i= 1; i<=k; ++i ) {
        fout<<ans[i]<<" ";
    }
    fout<<"\n";

    return 0;
}