Cod sursa(job #1275249)

Utilizator OnimushaLordTiberiu Copaciu OnimushaLord Data 24 noiembrie 2014 22:05:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
# include <cstdio>
# define N 100010

# define ultim(x) x[0]
# define mij ((l+r)>>1)

using namespace std;

int n,Max,pozitie;
int a[N],st[N],poz[N],sol[N];


int bs(int x)
{
    int find=0,l,r;
    l=1; r=ultim(st);
    while(l<=r && find==0)
    {
        if(st[mij]==x) find=mij;
        else if(st[mij]>x) r=mij-1;
        else l=mij+1;
    }
    if(find==0) return l;
    return find;
}

void load()
{
    freopen("scmax.in", "r", stdin);
    scanf("%d\n", &n);
    for(int i=1; i<=n; ++i)
        scanf("%d ", &a[i]);
    fclose(stdin);
    return;
}

void solve()
{
    for(int i=1; i<=n; ++i)
    {
        if(a[i]>st[ultim(st)])
        {
            st[++ultim(st)]=a[i];
            poz[i]=ultim(st);
        }
        else
        {
            poz[i]=bs(a[i]);
            st[poz[i]]=a[i];
        }
        if(Max<poz[i])
        {
            Max=poz[i];
            pozitie=i;
        }
    }
    return;
}

void write()
{
    freopen("scmax.out", "w", stdout);
    int curent=poz[pozitie];
    printf("%d\n", curent);
    sol[++ultim(sol)]=a[pozitie];
    for(int i=pozitie-1; i; --i)
        if(poz[i]==curent-1)
        {
            sol[++ultim(sol)]=a[i];
            curent=poz[i];
        }
    for(int i=ultim(sol); i>=1; --i)
        printf("%d ", sol[i]);
    fclose(stdout);
    return;
}

int main()
{
    load();
    solve();
    write();
}