Cod sursa(job #1718641)

Utilizator AlexVolatiluVoicu Alex AlexVolatilu Data 18 iunie 2016 17:00:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <stack>

using namespace std;

int v[100005],p[100005];
vector<int> q;
stack<int> rez;

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n,i,j,l=0,pozl=1;
    vector<int>::iterator pq;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",v+i);

    q.push_back(v[1]);
    p[1]=0;

    for(i=2;i<=n;i++)
    {
        pq=lower_bound(q.begin(),q.end(),v[i]);
        j=(int)(pq-q.begin());
        if(*pq==v[i])
        {
            p[i]=j;
            continue;
        }

        if(pq==q.end())
        {
            q.push_back(v[i]);
        }
        else *pq=v[i];

        p[i]=j;

        if(j>l) {l=j;pozl=i;}
    }

    printf("%d\n",l+1);

    rez.push(v[pozl]);
    l--;
    for(i=pozl-1;i>0&&l>=0;i--)
    {
        if(p[i]==l&&v[i]<rez.top())
        {
            rez.push(v[i]);
            l--;
        }
    }

    while(!rez.empty())
    {
        printf("%d ",rez.top());
        rez.pop();
    }

    return 0;
}