Cod sursa(job #2194091)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 12 aprilie 2018 11:48:56
Problema Subsir crescator maximal Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
int a[100005] , p[100005];
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n , i ;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
        vector<int>q;
        q.push_back(a[1]);
        p[1]=1;
        vector<int>::iterator it;
        for(i=2;i<=n;i++)
        {
            it=lower_bound(q.begin(),q.end(),a[i]);
            if((*it)==a[i])
                {
                    p[i]=it-q.begin()+1;
                    continue;
                }
            it=upper_bound(q.begin(),q.end(),a[i]);
            int pos=it-q.begin();
            pos++;
            if(it==q.end())
            {
                q.push_back(a[i]);
                p[i]=pos;
            }
            else
                {
                    p[i]=pos;
                    q[pos-1]=a[i];
                }
        }
        int max1=0;
        for(i=1;i<=n;i++)
        {
            if(p[i]>max1)max1=p[i];
        }
        printf("%d\n",max1);
        stack<int>st;
        for(i=n;i>=1;i--)
        {
            int j;
            for(j=n;j>=1;j--)
                if(p[j]==i)
            {
                st.push(a[j]);
                break;
            }
        }
        while(!st.empty())
        {
            printf("%d ",st.top());
            st.pop();
        }
    return 0;
}