Cod sursa(job #2417703)

Utilizator rares9991Matisan Rares-Stefan rares9991 Data 30 aprilie 2019 20:54:40
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <cstring>

#define Infinity 30000
using namespace std;

//ifstream fin("scmax.in");
//ofstream fout("scmax.out");

long long n,v[100001],p[100001],q[100001],len,maxx=0,imax;

int inssert(int a,int st, int dr)
{
    int mid=(st+dr)/2;
    if(st==dr)
    {
        if(dr>len)
            {
                q[++len+1]=Infinity;
            }
        q[st]=a;
        return st;
    }
    else
    {
        if(a<q[mid])
            return inssert(a,st,mid);
            else
                if(a>q[mid])
            return inssert(a,mid+1,dr);
    }
}

void buildPQ()
{
    len=0;
    q[1]=Infinity;
    for(int i=1;i<=n;i++)
        {
            p[i]=inssert(v[i],1,len+1);
        }
}

void buildSOL()
{
    int k=n;
    for(int i=len;i>=1;i--)
    {
        while(p[k]!=i)
            k--;
        q[i]=v[k];
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    buildPQ();
    buildSOL();
    cout<<len<<"\n";
    for(int i=1;i<=len;i++)
        cout<<q[i]<<" ";
    return 0;
}