Cod sursa(job #2414163)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 24 aprilie 2019 11:25:31
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
const int NMAX=100005;
vector<int>v;
int pos[100005];
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n,i,j,m,nr;
    scanf("%d",&n);
    v.push_back(0);
    for(i=1;i<=n;i++){scanf("%d",&nr);v.push_back(nr);}
    vector<int>q;
    q.push_back(v[1]);
    pos[1]=1;
    vector<int>::iterator it;
    for(i=2;i<=n;i++)
    {
        it=lower_bound(q.begin(),q.end(),v[i]);
        if((*it)==v[i])
        {
           pos[i]=it-q.begin()+1;
           continue;
        }
        if(it==q.end())
        {
            q.push_back(v[i]);
            pos[i]=q.size();
            continue;
        }
        q[it-q.begin()]=v[i];
        pos[i]=it-q.begin()+1;
    }
    int cm=1;
    for(i=1;i<=n;i++)
        cm=max(cm,pos[i]);
            printf("%d\n",cm);

    stack<int>st;
    for(i=n;i>=1;--i)
    {
        if(pos[i]==cm)
        {
            st.push(v[i]);
            --cm;
        }
    }

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