Cod sursa(job #895858)

Utilizator mvcl3Marian Iacob mvcl3 Data 27 februarie 2013 12:48:14
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<fstream>
using namespace std;

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

int n, a[100009], p[100009], q[100009], len;

inline int cauta(int st, int dr, int poz)
{
    int m, x;
    while(st <= dr)
    {
        m = (st + dr) >> 1;
        if(p[m] < a[poz]) st = m + 1;
        else
            x = m, dr = m - 1;
    }

    return x;
}
int main()
{
    f >> n;
    for(int i = 1; i <= n; ++i) f >> a[i];

    for(int i = 1; i <= n; ++i)
    {
        if(a[i] > p[len])
            p[++len] = a[i], q[i] = len;
        else
        {
            int poz = cauta(1, len, i);
            p[poz] = a[i];
            q[i] = poz;
        }
    }
    int k = 0;
    g<<len<<'\n';
    for(int i = n; i && len; --i)
        if(q[i] == len)
        {
            p[++k] = a[i];
            len--;
        }
    for(int i = k; i >= 1; --i) g<<p[i]<<' ';

    g<<'\n';

    g.close();
    return 0;

}