Cod sursa(job #1299647)

Utilizator nacrocRadu C nacroc Data 23 decembrie 2014 19:28:52
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>
#define NMAX 100001
#define inf 1<<30

using namespace std;

int v[NMAX],L[NMAX],sol[NMAX],sir[NMAX],n;

int bin(int x,int p,int q)
{
    int mij,min=inf;
    while(p<=q){
        mij=(p+q)/2;
        if(x<=sol[mij]){
            if(mij<min){
                min=mij;
                q=mij-1;
            }
            else
            break;
        }
        else
        p=mij+1;
    }
    if(min==inf) return 0;
    else return min;
}

int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n,k=0,index=0;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%d",&v[i]);
    for(int i=1;i<=n;++i){
        if(!bin(v[i],1,k)){
            if(v[i]>=sol[k]){
                sol[++k]=v[i];
                L[i]=k;
            }
            else{
                sol[k]=v[i];
                L[i]=++k;
            }
        }
        else{
            sol[bin(v[i],1,k)]=v[i];
            L[i]=bin(v[i],1,k);
        }
    }
    printf("%d\n",k);
    for(int i=n;i>=1;--i)
        if(L[i]==k){
            sir[++index]=v[i];
            --k;
        }
    for(int i=index;i>=1;--i)
        printf("%d ",sir[i]);
    return 0;
}