Cod sursa(job #1089073)

Utilizator robertc1Robert Ciobotaru robertc1 Data 21 ianuarie 2014 14:44:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#define IN "scmax.in"
#define OUT "scmax.out"
#define NMAX 100010
using namespace std;

ifstream fin(IN);
ofstream fout(OUT);

int n,b;
int A[NMAX],best[NMAX],poz[NMAX];

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

int binar(int x)
{
    int st=0;
    int dr=b+1;
    int mij;

    while(dr-st>1)
    {
        mij=(dr-st)/2+st;
        if(best[mij]<x)
        {
            st=mij;
        }
        if(best[mij]>x)
        {
            dr=mij;
        }
        if(best[mij]==x) return mij;
    }
    return dr;
}

void rezolva()
{
    int i,x;
    for(i=1; i<=n; i++)
        if(A[i]>best[b])
        {
            b++;
            best[b]=A[i];
            poz[i]=b;
        }
        else
        {
            x=binar(A[i]);
            best[x]=A[i];
            poz[i]=x;
        }
}

void afisare()
{
    int i,sol[NMAX],b1=b;
    fout<<b<<'\n';
    for(i=n; i>=1; i--)
    {
        if(poz[i]==b)
        {
            sol[b]=A[i];
            b--;
        }
    }
    for(i=1; i<b1; i++) fout<<sol[i]<<' ';
    fout<<sol[i];
}
int main()
{
    citire();
    rezolva();
    afisare();
    return 0;
}