Cod sursa(job #1338629)

Utilizator malina_floreaMalina Florea malina_florea Data 10 februarie 2015 10:25:03
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#define DMAX 100010
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

void citire();
void pd();
void afisare();
int cautare_binara(int, int);

int n;
int a[DMAX], poz[DMAX];
int nrb=0, best[DMAX];
int sol[DMAX];

int main()
{
    citire();
    pd();
    afisare();
    
    fin.close();
    fout.close();
    return 0;
}


void citire()
{
    int i;
    fin>> n;
    for (i=1; i<=n; i++) fin>> a[i];
}

void pd()
{
    int i, aux;
    
    best[++nrb]=a[1];
    poz[1]=1;
    
    for (i=2; i<=n; i++)
        if (a[i] > best[nrb])
        {
            best[++nrb] = a[i];
            poz[i]=nrb;
        }
        else
        {
            aux=cautare_binara(a[i], nrb);
            best[aux] = a[i];
            poz[i]=aux;
        }
}

int cautare_binara(int x, int dim)
{
    int dr=dim+1, st=0, mij;
    
    while (dr-st>1)
    {
        mij=(st+dr)/2;
        
        if (best[mij]>=x) dr=mij;
        else st=mij;
    }
    
    if (dr>dim) return 0;
    return dr;
}

void afisare()
{
    int i, nr = nrb;
    
    for (i=n; i>=1; i--)
        if (poz[i] == nr)
            sol[nr--] = a[i];
    
    fout<< nrb<< '\n';
    for (i=1; i<=nrb; i++) fout<< sol[i]<< ' ';
}