Cod sursa(job #979010)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 31 iulie 2013 09:06:32
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <cstdio>

using namespace std;

int cb(int st[100069], int m, int h)
  {
      int p1,p2,mij,pos;
      p1=1; p2=m; pos=0;
      while (p1<=p2 && !pos)
        {
            mij=(p1+p2)/2;
            if (st[mij]<h) p1=mij+1;
               else if (st[mij]>h) p2=mij-1;
                else pos=mij;

             if (p1>p2) pos=p1;
              else if (st[mij]<h && st[mij+1]>h && mij+1<m) pos=mij+1;

        }
       return pos;
  }

int n,a[100069],poz[100069],st[100069],m,u[100069],i,pos,k;

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

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

    st[1]=a[1]; poz[1]=1; m=1;

    for (i=2;i<=n;i++)
      {
          pos=cb(st,m,a[i]);
          st[pos]=a[i]; if (pos>m) m++;
          poz[i]=pos;
      }
    for (i=n;i>=1;i--)
      if (poz[i]==m) {u[++k]=a[i]; m--;}

    printf("%d\n", k);
    for (i=k;i>=1;i--) printf("%d ",u[i]);




    return 0;
}