Cod sursa(job #1260738)

Utilizator c0rn1Goran Cornel c0rn1 Data 11 noiembrie 2014 15:37:59
Problema Subsir crescator maximal Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#define nmax 100008

using namespace std;

int n, a[nmax], maxi;
int d[nmax], q[nmax], p[nmax], sol[nmax];

void citire()
{
    scanf("%d", &n);
    for (int i=1; i<=n; i++)
        scanf("%d ", &a[i]);
}

int cautBin(int x, int n)
{
    int s=1, d=n;
    while (s<=d)
    {
        int mid=(s+d)/2;
        if (x>q[mid])
            s=mid+1;
        else
            d=mid-1;
    }
    return s;
}

void solve()
{
    q[++q[0]]=a[1];
    p[1]=1;
    for (int i=2; i<=n; i++)
    {
        if (a[i]>q[q[0]])
        {
            q[++q[0]]=a[i];
            p[i]=p[q[q[0]-1]]+1;
        }
        else
        {
            p[i]=cautBin(a[i], q[0]);
            q[p[i]]=a[i];
        }
    }
    printf("%d\n", q[0]);
}

void afisare()
{
    for (int i=n; i>=1; i--)
        if (q[0]==p[i])
        {
            sol[0]++;
            sol[q[0]--]=a[i];
        }
    for (int i=1; i<=sol[0]; i++)
        printf("%d ", sol[i]);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    citire();
    solve();
    afisare();

    return 0;
}