Cod sursa(job #1231728)

Utilizator george_stelianChichirim George george_stelian Data 21 septembrie 2014 13:58:59
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 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],aib[100010],sol[100010],aux;
int v[100010],rez[100010],n,i,a,maxx,nr;

void aib_update(int x,int poz)
{
    for(int i=poz;i<=n;i+=putere(i))
        if(x>aib[i].x)
        {
            aib[i].x=x;
            aib[i].poz=poz;
        }
}

void aib_query(int poz)
{
    aux.x=0;
    for(int i=poz;i>0;i-=putere(i))
        if(aux.x<aib[i].x)
        {
            aux.x=aib[i].x;
            aux.poz=aib[i].poz;
        }
}

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);
    maxx=0;
    for(i=1;i<=n;i++)
    {
        aib_query(v1[i].poz);
        if(aux.x==0)
        {
            sol[v1[i].poz].x=1;
            aib_update(1,v1[i].poz);
        }
        else
        {
            sol[v1[i].poz].x=aux.x+1;
            sol[v1[i].poz].poz=aux.poz;
            aib_update(aux.x+1,v1[i].poz);
        }
        if(maxx<sol[v1[i].poz].x)
        {
            maxx=sol[v1[i].poz].x;
            a=v1[i].poz;
        }
    }
    for(i=sol[a].x;i;i--)
    {
        if(nr==0 || v[a]<rez[nr]) rez[++nr]=v[a];
        a=sol[a].poz;
    }
    printf("%d\n",nr);
    for(i=nr;i;i--) printf("%d ",rez[i]);
    return 0;
}