Cod sursa(job #1508503)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 22 octombrie 2015 17:33:24
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct inaib
{
    int s,poz;
    inaib(int s1=0,int poz1=0) {s=s1;poz=poz1;}
}aib[100010],d[100010];
int v[100010],norm[100010],sol[100010],n;

int poz_norm(int x)
{
    return lower_bound(norm+1,norm+1+n,x)-norm;
}

void aib_update(int i,int s,int poz)
{
    for(;i<=n;i+=i&(-i))
        if(s>aib[i].s) aib[i]=inaib(s,poz);
}

inaib aib_query(int i)
{
    inaib sol;
    for(;i>0;i-=i&(-i))
        if(aib[i].s>sol.s) sol=aib[i];
    return sol;
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int nr=0,maxx=0,poz;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        norm[i]=v[i];
    }
    sort(norm+1,norm+1+n);
    for(int i=1;i<=n;i++)
    {
        d[i]=aib_query(poz_norm(v[i])-1);
        d[i].s++;
        aib_update(poz_norm(v[i]),d[i].s,i);
        if(d[i].s>maxx) {maxx=d[i].s;poz=i;}
    }
    for(int i=poz;i>0;i=d[i].poz)
        sol[++nr]=v[i];
    printf("%d\n",nr);
    for(int i=nr;i;i--) printf("%d ",sol[i]);
    return 0;
}