Cod sursa(job #2279997)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 10 noiembrie 2018 10:54:36
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <algorithm>
#include <cstdio>
#define N 100005

using namespace std;

int n, a[N], b[N], p[N], s[N];

int caut(int x, int st, int dr)
{
   if(st==dr)
   {
       if(b[st]>=x)
            return st;
       return -1;
   }
   int mij=(st+dr)/2;
   if(b[mij]<x)
      return caut(x, mij+1, dr);
   return caut(x, st, mij);
}

void citire()
{
    scanf("%d\n", &n);
    scanf("%d ", &a[1]);
    b[++b[0]]=a[1];
    p[1]=1;
    for(int i=2;i<=n;i++)
    {
        scanf("%d ", &a[i]);
        int poz=caut(a[i], 1, p[i-1]);
        if(poz==-1)
        {
            b[++b[0]]=a[i];
            p[i]=b[0];
        }
        else
        {
            b[poz]=a[i];
            p[i]=poz;
        }
    }
}

void subsir(int lg, int n)
{
    if(lg==0)
        return;
    if(p[n]==lg)
    {
        s[++s[0]]=a[n];
        subsir(lg-1, n-1);
        return;
    }
    subsir(lg, n-1);
}

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


    citire();
    printf("%d\n", b[0]);
    subsir(b[0], n);
    sort(s+1, s+1+b[0]);
    for(int i=1;i<=b[0];i++)
        printf("%d ", s[i]);
    return 0;
}