Cod sursa(job #886500)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 22 februarie 2013 22:01:54
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#include<string.h>

using namespace std;

const int MAX_N = 100002;
const int INF = 0x3f3f3f3f;

int N, Max, p;
int a[ MAX_N ], st[ MAX_N ], P[ MAX_N ], sol[ MAX_N ];

inline int bs(int x)
{
    int left = 0, mid = 0, right = Max + 1;

    while(left < right)
    {
        mid = (left + right) / 2;

        if(st[mid] >= x)
            right = mid;
        else left = mid + 1;
    }

    return left;
}

int main()
{
    ifstream f("scmax.in");
    ofstream g("scmax.out");

    f >> N;
    for(int i = 1; i <= N; ++i)
        f >> a[i];

    memset(st, INF, sizeof(st));
    st[0] = 0;

    for(int i = 1; i <= N; ++i)
    {
        p = bs(a[i]);
        st[p] = a[i];
        P[i] = p;
        if(p > Max)
            Max = p;
    }

    int j = N, k = 0;
    for(int i = Max; i; --i)
    {
        while(P[j] != i)
            --j;
        ++k, sol[k] = a[j];
    }

    g << Max << '\n';
    for(int i = 1; i < Max; ++i)
        g << sol[i] << " ";
    g << sol[Max] << '\n';

    f.close();
    g.close();
}