Cod sursa(job #1995245)

Utilizator victoreVictor Popa victore Data 27 iunie 2017 13:20:50
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<cstdio>
#include<algorithm>
#include<stack>

using namespace std;

const int nmax=100005;
stack<int> st;

struct al
{
    int x,i;
}v[nmax];

int arb[4*nmax+55],poz,val,maxval,d[nmax];

inline bool cmp(al a,al b)
{
    if(a.x==b.x)
        return b.i<a.i;
    return a.x<b.x;
}

inline int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}

inline void update(int node,int st,int dr)
{
    if(st==dr)
    {
        arb[node]=val;
        return;
    }
    int med=((dr-st)>>1) + st;
    if(poz>med)
        update(node<<1|1,med+1,dr);
    else
        update(node<<1,st,med);
    arb[node]=max(arb[node<<1],arb[node<<1|1]);
}

inline void query(int node,int st,int dr)
{
    if(1<=st&&dr<=poz)
    {
        maxval=max(maxval,arb[node]);
        return;
    }
    int med=((dr-st)>>1)+st;
    if(st<=poz)
        query(node<<1,st,med);
    if(med<poz)
        query(node<<1|1,med+1,dr);
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n,i,j;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
        scanf("%d",&v[i].x),v[i].i=i;
    sort(v+1,v+n+1,cmp);
    int maxim=0;
    for(i=1;i<=n;++i)
    {
        maxval=0;
        poz=v[i].i;
        query(1,1,n);
        d[i]=maxval+1;
        poz=v[i].i;
        val=d[i];
        update(1,1,n);
        if(val>maxim)
            maxim=val;
    }
    printf("%d\n",maxim);
    int previ=n+1;
    for(i=n;i;--i)
        if(d[i]==maxim&&previ>v[i].i)
        {
            previ=v[i].i;
            maxim--;
            st.push(v[i].x);
        }
    while(!st.empty())
    {
        printf("%d ",st.top());
        st.pop();
    }
}