Cod sursa(job #2296472)

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

using namespace std;

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

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",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.pb(v[i]);
        }    
    }
    reverse(sol.begin(),sol.end());
    printf("%d\n",sol.size());
    for(int i = 0 ; i < sol.size() ; i++)
        printf("%d ",sol[i]);
    return 0;
}