Cod sursa(job #905754)

Utilizator mvcl3Marian Iacob mvcl3 Data 6 martie 2013 09:28:33
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 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;
}