Cod sursa(job #992310)

Utilizator misinozzz zzz misino Data 1 septembrie 2013 17:16:21
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<algorithm>
#include<cstdio>
#define N 100100
using namespace std;
int i,nr,n,poz,maxi,p,v[N],a[N],b[N],aib[N],d[N],pred[N];
inline void afis(int x)
{
    if(!x)
    {
        printf("%d\n",nr);
        return ;
    }
    ++nr;
    afis(pred[x]);
    printf("%d ",v[x]);
}
inline void update(int x,int p)
{
    for(;p<=n;p+=(p&(-p)))
    if(d[aib[p]]<d[x])
    aib[p]=x;
}
inline int query(int x)
{
    int maxi=0;
    for(;x;x-=(x&(-x)))
    if(d[aib[x]]>d[maxi])
    maxi=aib[x];
    return maxi;
}
inline int cautbin(int v[],int li,int ls,int x)
{
    int mij;
    while(li<=ls)
    {
        mij=(li+ls)>>1;
        if(v[mij]==x)
        return mij;
        if(v[mij]>x)
        ls=mij-1;
        else
        li=mij+1;
    }
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    int ok=0;
    for(i=1;i<=n;++i)
    {
        scanf("%d",&a[i]);
        v[i]=b[i]=a[i];
        if(a[i]>a[i-1])
        ok=1;
    }
    if(!ok)
    {
        printf("1\n%d",a[1]);
        return 0;
    }
    sort(b+1,b+n+1);
    for(i=1;i<=n;++i)
    if(b[i]!=b[nr])
    b[++nr]=b[i];
    for(i=1;i<=n;++i)
    a[i]=cautbin(b,1,nr,a[i]);
    nr=0;
    for(i=1;i<=n;++i)
    {
        p=query(a[i]-1);
        d[i]=d[p]+1;
        pred[i]=p;
        update(i,a[i]);
    }
    for(i=1;i<=n;++i)
    if(d[i]>maxi)
    maxi=d[i],poz=i;
    afis(poz);
}