Cod sursa(job #1414364)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 2 aprilie 2015 15:58:36
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>

#define Nmax 100010

using namespace std;

int n , i , lg , crt;
int a[Nmax] , Max_pos[Nmax];

vector < int > left;
vector < int > :: iterator poz;

queue < int > sol;

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    scanf("%d", &n);

    for (i = 1; i <= n; ++i)
    {
        scanf("%d", &a[i]);

        poz = upper_bound(left.begin() , left.end() , a[i]);

        if (poz == left.end() && (left.empty() || *(--poz) < a[i]))
        {
            left.push_back(a[i]);
            Max_pos[i] = left.size();
            lg = left.size();
        }
        else if (poz == left.begin() || *(--poz) < a[i])
        {
            if (*poz < a[i]) poz++;
            *poz = a[i];
            Max_pos[i] = poz - left.begin() + 1;
        }
    }

    for (crt = 1 , i = 1; i <= n; ++i)
        if (Max_pos[i] == crt)
        {
            sol.push(a[i]);
            ++crt;
        }

    for (printf("%d\n", lg); sol.size(); sol.pop())
      printf("%d ", sol.front());

    return 0;
}