Cod sursa(job #651914)

Utilizator rootsroots1 roots Data 22 decembrie 2011 11:34:34
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

#define vL 100001
#define qL 100001
#define dL 100001
#define solL 100001

using namespace std;

ifstream in;
ofstream out;

int v[vL],d[dL],q[qL],sol[solL];

inline int BS(int x,int L,int R)
{
    if(L<R)
    {
        int M=(L+R)>>1;
        if(v[q[M]]<x) return BS(x,M+1,R);
        else return BS(x,L,M);
    }
    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();

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

    out.open("scmax.out");

    out<<q[0]<<'\n';
    for(int i=N;i>0;--i)
        if(d[i]==q[0]&&(sol[sol[0]]>v[i]||sol[0]==0))
        {
            sol[++sol[0]]=v[i];
            if(--q[0]==0) break;
        }

    for(int i=sol[0];i>1;--i) out<<sol[i]<<' ';
    out<<sol[1]<<'\n';

    out.close();

    return 0;
}