Cod sursa(job #1232057)

Utilizator george_stelianChichirim George george_stelian Data 21 septembrie 2014 22:44:09
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <algorithm>
#define putere(x) (x)&(-x)

using namespace std;

struct structura
{
    int x,poz;
    bool operator <(const structura &aux) const
    {
        return x<aux.x;
    }
}v1[100010];
int aib[100010],v[100010],sol[100010],rez[100010],n,i,nr,maxx,a,s;

void aib_update(int poz,int s)
{
    int i;
    for(i=poz;i<=n;i+=putere(i)) aib[i]=max(aib[i],s);
}

int aib_query(int poz)
{
    int s=0,i;
    for(i=poz;i>0;i-=putere(i)) s=max(s,aib[i]);
    return s;
}

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