Cod sursa(job #905494)

Utilizator assa98Andrei Stanciu assa98 Data 5 martie 2013 21:21:42
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdlib>
#include <cstdio>
#include <set>
using namespace std;

struct sp
{
    int val,sol;
    sp()
    {
        val=0;
        sol=0;
    }

    sp(int a,int b)
    {
        val=a;
        sol=b;
    }
};

class cmp
{
public:
    inline bool operator ()(sp a,sp b)
    {
        return a.val<b.val;
    }
};

set<sp,cmp> s;

pair< set<sp,cmp>::iterator ,bool> ret;

int v[100100];
int n;

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);
    s.insert(sp());
    s.insert( sp(v[1],1) );
    for(int i=2;i<=n;i++)
    {
        set<sp,cmp>::iterator it,it2,it3;
        it=s.upper_bound( sp(v[i],0) );
        it2=it;
        advance(it2,-1);
        ret=s.insert( sp(v[i], (*it2).sol+1) );
        it=ret.first;
        it2=it;
        it3=it;
        advance(it2,-1);
        advance(it3,1);
        if((*it).sol==(*it2).sol)
        {
            s.erase(it);
        }
        else
        {
            if(it3!=s.end())
            {
                if((*it).sol==(*it3).sol)
                    s.erase(it3);
            }
        }
    }
    printf("%d\n",s.size()-1);
    set<sp,cmp>::iterator it=s.begin();
    advance(it,1);
    for(it;it!=s.end();++it)
        printf("%d ",(*it).val);
}