Cod sursa(job #1830015)

Utilizator dareare14Daria Petca dareare14 Data 15 decembrie 2016 23:14:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>

using namespace std;

ifstream F ("scmax.in");
ofstream G ("scmax.out");

int poz, n, v[100010], sol[100010], k[100010], st, dr, po, j, mij, pozsol;
pair <int, int> p[100010];

int main()
{
    F >> n;
    for (int i = 1; i <= n; ++ i)
        F >> v[i];
    p[1] = make_pair(v[1], 1);
    poz = 1;
    for (int i = 2; i <= n; ++ i)
    {
        st = 1; dr = poz;
        po = -1;
        while(st <= dr)
        {
            mij = (st + dr) / 2;
            if (p[mij].first >= v[i])
                dr = mij - 1, po = mij;
            else
                st = mij + 1;
        }
        if (po == -1)
            p[++ poz] = make_pair(v[i], i), k[i] = p[poz - 1].second;
        else
            p[po] = make_pair(v[i], i), k[i] = p[po - 1].second;
    }
    pozsol = poz;
    G << pozsol << '\n';
    poz = p[poz].second;
    while(poz) sol[++ j] = v[poz], poz = k[poz];
    for(int i = pozsol; i > 0; -- i)
        G << sol[i] << " ";
}