Cod sursa(job #976600)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 23 iulie 2013 14:54:04
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
#include <algorithm>
#include <vector>

#define In "scmax.in"
#define Out "scmax.out"
#define Nmax 100002
#define Lim 9000000
#define Next (++pos==Lim)?(in.read(Buffer,Lim),pos = 0):0

using namespace std;

int  N, dp[Nmax], Last[Nmax], a[Nmax], v[Nmax], A[Nmax], sol, pos, aib[Nmax],F[Nmax];
char Buffer[Lim];
inline void Update(const int poz,const int val)
{
    for(int i = poz;i <= N;i += F[i])
        if(dp[aib[i]]<dp[val])
            aib[i] = val;
}
inline int Query(const int x)
{
    int i, ret = 0;
    for(i = x; i; i-= F[i])
        if(dp[aib[i]] > dp[ret])
            ret = aib[i];
    return ret;
}

ifstream in(In);
ofstream out(Out);

inline void Read(int &x)
{
    while(Buffer[pos]<'0' || '9'<Buffer[pos])
        Next;
    x = 0;
    while('0'<=Buffer[pos] && Buffer[pos]<='9')
    {
        x = x*10 +Buffer[pos]-'0';
        Next;
    }
}

inline void Calculate()
{
    for(int i = 1;i <= N; ++i)
        F[i] = (i & (-i));
}

inline void Read()
{
    in.read(Buffer,Lim);
    Read(N);
    for(int i = 1;i <= N;++i)
    {
        Read(A[i]);
        a[i] = A[i];
    }
    in.close();
}

inline void Normalization()
{
    int i;
    sort(A+1,A+N+1);
    for(i = 1;i <= N; ++i)
        v[i] = upper_bound(A+1,A+N+1,a[i])-A-1;
}

inline void Solve()
{
    int i, j;
    for(i=1;i<=N;++i)
    {
        j = Query(v[i]-1);
        dp[i] = 1+dp[j];
        Last[i] = j;
        Update(v[i],i);
        if(dp[i]>dp[sol])
            sol = i;
    }
}

inline void Write()
{
    int i,n = dp[sol],v[Nmax];
    out<<n<<"\n";
    for(i = 1; sol ;sol = Last[sol],++i)
        v[i] = a[sol];
    for(i = n;i;--i)
        out<<v[i]<<" ";
    out<<"\n";
    out.close();
}

int main()
{
    Read();
    Normalization();
    Calculate();
    Solve();
    Write();
    return 0;
}