Cod sursa(job #744588)

Utilizator adalLica Adela adal Data 9 mai 2012 10:19:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>
#define INF 2000000001
using namespace std;

int Q[100002], P[100002], A[100002], i, K, L=0, n, Mx;

int cb(int x, int st, int dr){

  int m, poz=0;
  while (st<=dr && !poz){
    m=(st+dr)/2;
    if (Q[m]==x) poz=m;
    else if (Q[m]>x) dr = m-1;
         else st = m+1;
  }
    if (!poz) poz=st;
    if  (st>L) L++;
    Q[poz]=x;
    return poz;
}

void scrie ( int i, int x, int mx){

  if(i>0){
    if (A[i]<x && P[i]==mx) {
       scrie (i-1, A[i], mx-1);
       printf("%d ", A[i]);
    }
    else scrie (i-1, x, mx);
    }
}

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

    scanf("%d\n", &n);

    for (i=1; i<=n; ++i) scanf("%d", &A[i]);

    for (i=1; i<=n; ++i)
       {
        P[i]=cb(A[i],1,L);
        if (P[i]>Mx) {Mx=P[i]; K=i;}
       }

    printf("%d\n", L);

    scrie(K, INF, Mx);
    return 0;
}