Cod sursa(job #2296460)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 4 decembrie 2018 18:27:42
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>
#define pb push_back

using namespace std;

const int NMAX = 10005;
vector<int>q;
int v[NMAX];
int p[NMAX];
set<int>sol;

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","r",stdout);   
    int n;
    scanf("%d",&n);
    for(int i = 0 ; i < n ; i++)
        scanf("%d",&v[i]);
    for(int i = 0 ; i < n ; i++)
    {
        if(q.empty())
        {
            q.pb(v[i]);
            p[0]=0;
            continue;
        }
        vector<int>::iterator it;
        int poz;
        int val = v[i];
        it = lower_bound(q.begin(),q.end(),val);
        if(it == q.end())
        {
            q.pb(v[i]);
            p[i] = q.size()-1;
            continue;
        }
        poz = it - q.begin();
        *it = v[i];
        p[i] = poz;
    }
    int ct = q.size()-1;
    int pos;
    for(int i = n-1 ; i >= 0 ; i--)
    {
        if(p[i] == ct)
        {
            pos = i;
            break;
        }
    }
    for(int i = pos ; i >= 0 ; i--)
    {
        if(p[i] == ct)
        {
            ct--;
            sol.insert(v[i]);
        }    
    }
    printf("%d\n",sol.size());
    set<int>::iterator it;
    for(it = sol.begin() ; it != sol.end() ; it++)
        printf("%d ",*it);
    return 0;
}