Cod sursa(job #1753012)

Utilizator Burbon13Burbon13 Burbon13 Data 5 septembrie 2016 17:57:54
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>

using namespace std;

const int nmx = 100002;

int n;
int t = 1;
int v[nmx];
int val[nmx],ant[nmx],pos[nmx];
int maxx = -1, poss = 1;

void citire()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
}

void rezolvare()
{
    val[1] = 1;

    for(int i = 2; i <= n; ++i)
    {
        if(v[i] > v[val[t]])
        {
            ++ t;
            val[t] = i;
            ant[i] = val[t-1];
            poss = i;
        }
        else
        {
            int st = 1, dr = t;

            while(st <= dr)
            {
                int mij = (st + dr) / 2;
                if(v[i] <= v[val[mij]] && v[i] > v[val[mij-1]])
                {
                    ant[i] = val[mij-1];
                    val[mij] = i;
                    break;
                }
                else if(v[i] > v[val[mij]])
                    st = mij + 1;
                else
                    dr = mij - 1;
            }
        }
    }
}

void rec(int p)
{
    if(p)
    {
        rec(ant[p]);
        printf("%d ", v[p]);
    }
}

void afish()
{
    printf("%d\n", t);

    rec(poss);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    citire();
    rezolvare();
    afish();
    return 0;
}