Cod sursa(job #1834159)

Utilizator infomaxInfomax infomax Data 23 decembrie 2016 23:50:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 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)
    {
        po = -1;
        st = 1; dr = poz;
        while (st <= dr)
        {
            mij = (st + dr) / 2;
            if(p[mij].first >= v[i])
                po = mij, dr = mij - 1;
            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] << " ";
    return 0;
}