Cod sursa(job #2349187)

Utilizator traiandobrinDobrin Traian traiandobrin Data 20 februarie 2019 11:27:16
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define limit 100005
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");

long long n,mx=1,pose=limit,v[limit],q[limit],ss[limit];
pair <int,int> p[limit];
int cb(int m)
{
    int msk,pos=0;
    for(msk=1<<10;msk>0;msk/=2)
    if(q[pos+msk]<m && pos+msk<=mx)
    pos+=msk;
    return pos+1;
}
int cb2(int m)
{
    int msk=1<<10,pos=0;
    for(;msk>0;msk/=2)
    if(p[msk+pos].first<=m && pos+msk<=n)
    pos+=msk;
    return pos;
}
int main()
{ //5 24 12 15 15 19
    //6 2 5 7 3 4 1
    int i,j,pos;
    cin>>n;
    for(i=1;i<=n;++i)
    cin>>v[i];
    q[1]=v[1]; p[1].first=1; p[1].second=1;
    for(i=2;i<=n;++i)
    {pos=cb(v[i]); p[i].first=pos; p[i].second=i;
    if(v[i]>q[mx]) { ++mx; q[mx]=v[i];}
    else
    q[pos]=v[i];
    } cout<<mx<<'\n';
    if(mx==1){
    cout<<v[1]; return 0;}
    sort(p+1,p+n+1); //cout<<p[2].second<<'\n';
    /*for(i=1;i<=mx;++i)
    cout<<p[i].first<<" ";
    cout<<endl;*/
    for(i=mx;i>=1;--i)
    {
        pos=cb2(i);
        ss[i]=v[p[pos].second];
        pose=pos;
    }
    for(i=1;i<=mx;++i)
    cout<<ss[i]<<" ";
   return 0;
}