Cod sursa(job #701712)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 1 martie 2012 17:25:55
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#define nmax 100004
#define LIM (1<<25)
#define verifica ++poz == LIM ? in.read(my_text,LIM),poz = 0 : 0
using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

char my_text[LIM+2];
int poz;

int step,L,N;
int SC[nmax],V[nmax],T[nmax];

void Afiseaza(int p)
{
    if(T[p])
        Afiseaza(T[p]);
    out<<V[p]<<' ';
}

inline void Citeste(int &nr)
{
    if(my_text[0]=='\0')in.read(my_text,LIM);
    else for(;my_text[poz]>'9'||my_text[poz]<'0';verifica);
    for(nr=0;my_text[poz]>='0'&&my_text[poz]<='9';nr=nr*10+my_text[poz]-'0',verifica);
}

inline int Cauta(int x)
{
    int i;
    //caut binar intre 1 si L
    for(step=1;step<L;step<<=1);
    for(i=0;step;step>>=1)
        if(i+step<=L)
            if(V[SC[i+step]]<x)
                i+=step;
    return i;
}

int main()
{
    int i,x,P;
    Citeste(N);
    for(i=1;i<=N;i++)
        Citeste(V[i]);
    SC[1] = 1;
    L = 1;
    for(i=2;i<=N;i++)
    {
        x = V[i];
        P = Cauta(x);
        if(P==L)
            SC[++L]=i;
        else if(V[SC[P+1]]>x)
            SC[P+1]=i;
        T[i] = SC[P];
    }
    out<<L<<'\n';
    Afiseaza(SC[L]);
    return 0;
}