Cod sursa(job #1517739)

Utilizator LurchssLaurentiu Duma Lurchss Data 4 noiembrie 2015 19:12:06
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <stack>

#define nmax 100005
using namespace std;

int n;
int a[nmax];
int s1[nmax];
int s2[nmax];
stack<int> sol;
void read()
{
    scanf("%d ",&n);
    for(int i=1;i<=n;i++)
        scanf("%d ",&a[i]);
}

int search_binary(int st,int dr,int x)
{
    if(st==dr)
        {
            s1[st]=x;
            return st;
        }
    int mij=(st+dr)/2;
    if(s1[mij]>=x)
        return search_binary(st,mij,x);
    else
        return search_binary(mij+1,dr,x);
}

void solve()
{
    for(int i=1;i<=n;i++)
        if(s1[s1[0]]<a[i])
            {s1[++s1[0]]=a[i];
            s2[i]=s1[0];}
        else s2[i]=search_binary(1,s1[0],a[i]);
    printf("%d\n",s1[0]);
    for(int i=n;i>=1;i--)
        if(s2[i]==s1[0] && s1[s1[0]]<=a[i])
            {sol.push(a[i]);
             s1[0]--;
            }
    while(!sol.empty())
    {
        printf("%d ",sol.top());
        sol.pop();
    }
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    read();
    solve();
    return 0;
}