Cod sursa(job #1856274)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 24 ianuarie 2017 18:51:20
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>

using namespace std;

int n, v[100005], m[100005], p[100005], nr, s[100005];

void read()
{
    ifstream fin ("scmax.in");
    fin >> n;
    for (int i = 1; i <= n; ++i)
        fin >> v[i];
    fin.close();
}

int src(int x)
{
    int lo = 0, hi = nr;
    for (int  mid = (lo + hi) >> 1; lo <= hi; mid = (lo + hi) >> 1)
        if (v[m[mid]] < x && v[m[mid+1]] >= x)
            return mid;
        else if (v[m[mid]] < x)
            lo = mid + 1;
        else
            hi = mid - 1;
    return nr;
}

void solve()
{
    int poz;m[1] = 1, m[0] = 0;
    for (int i = 2; i <= n; ++i){
        poz = src(v[i]);
        if (poz + 1> nr)
            nr = poz + 1;
        p[i] = m[poz];
        m[poz + 1] = i;
    }
    int k = m[nr];
    for (int i = nr - 1; i >= 0; --i){
        s[i] = v[k];
        k = p[k];
    }
}

void write()
{
    ofstream fout ("scmax.out");
    fout << nr << "\n";
    for (int i = 0; i < nr; ++i)
        fout << s[i] << " ";
    fout.close();
}

int main()
{
    read();
    solve();
    write();
    return 0;
}