Cod sursa(job #1073878)

Utilizator classiusCobuz Andrei classius Data 6 ianuarie 2014 21:22:26
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
using namespace std;

#include<iomanip>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<utility>
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<numeric>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<deque>

#define FILES

#ifdef FILES
#include<fstream>
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#else
#include<iostream>
#endif

#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define ALL(a) a.begin(),a.end()
#define p_b(a) push_back(a)
#define m_p(a,b) make_pair(a,b)
#define p_p(a,b) p_b(m_p(a,b))

typedef unsigned char uchar;
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vint;
typedef queue<int> qint;
typedef pair<int,int> pii;
typedef queue<pii> qpii;
typedef vector<pii> vpii;
typedef vector<string> vstr;
typedef vector<ll> vll;
typedef deque<int> dqint;
typedef deque<ll> dqll;
typedef map<string,int> mpstri;
typedef map<int,int> mpinti;
typedef map<string,string> mpstrs;
typedef map<string,vstr> mpstrvs;
const int INFI=(1LL<<31)-10;
const ll INFL=(1LL<<62);
const double eps=1e-7;
const long double pi=acos(-1.0);
const int MAXN=100002;

int v[MAXN],key[MAXN],lon[MAXN],prec[MAXN],idx[MAXN];
pii u[MAXN];

bool cmp(const pii& p1,const pii &p2){
    return p1.first<p2.first;
}

int main(){
    int n;
    cin>>n;

    for(int i=1;i<=n;i++){
        cin>>v[i];
        u[i].first=v[i];
        u[i].second=i;
    }

    sort(u+1,u+n+1,cmp);

    int nr=1;
    v[u[1].second]=1;
    key[1]=u[1].first;

    for(int i=2;i<=n;i++){
        if(u[i].first!=u[i-1].first){
            nr++;
        }
        v[u[i].second]=nr;
        key[nr]=u[i].first;
    }

    for(int i=0;i<MAXN;i++){
        lon[i]=INFI;
    }

    lon[1]=v[1];
    idx[1]=1;

    for(int i=2;i<=n;i++){
        int pz=lower_bound(lon+1,lon+n+1,v[i])-lon;
        lon[pz]=v[i];
        prec[i]=idx[pz-1];
        idx[pz]=i;
    }

    int mxp;

    for(int i=n;i>=1;i--){
        if(lon[i]!=INFI){
            cout<<i<<'\n';
            mxp=idx[i];
            break;
        }
    }

    vint sl;
    while(mxp){
        sl.p_b(mxp);
        mxp=prec[mxp];
    }

    for(int i=sl.size()-1;i>=0;i--){
        cout<<key[v[sl[i]]]<<" ";
    }


    return 0;
}