Cod sursa(job #603831)

Utilizator nervousNervous nervous Data 18 iulie 2011 18:47:35
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <cstring>

#define X1 100001

using namespace std;

ifstream in;
ofstream out;

int v[X1],d[X1],q[X1];

inline int BS(int x,int L,int R)
{
    if(L<=R)
    {
        int M=L+(R-L)/2;

        if(x<q[M]) return BS(x,M+1,R);
        else return BS(x,L,M-1);
    }
    else
    return L;
}

int main()
{
    int N,pos;

    in.open("scmax.in");
    in>>N;
    for(int i=1;i<=N;++i) in>>v[i];
    in.close();

    memset(d,0,sizeof(d));
    memset(q,0,sizeof(q));

    d[N]=1;
    q[++q[0]]=v[N];

    for(int i=N-1;i>0;--i)
        if(q[q[0]]>v[i])
        {
            q[++q[0]]=v[i];
            d[i]=q[0];
        }
        else
        {
            pos=BS(v[i],1,q[0]);
            d[i]=d[pos];
            q[pos]=v[i];
        }

    out.open("scmax.out");
    pos=N;
    for(int i=1;i<N;++i)
        if(d[pos]<d[i]) pos=i;
    out<<d[pos]<<'\n';
    pos=d[pos];
    int x=-1;
    for(int i=1;i<=N;++i)
        if(d[i]==pos&&x<v[i])
        {
            x=v[i];
            pos--;
            out<<v[i]<<' ';
            if(!pos) break;
        }
    out<<'\n';
    out.close();

    return 0;
}