Cod sursa(job #1378587)

Utilizator robertstrecheStreche Robert robertstreche Data 6 martie 2015 13:05:29
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
#include <iostream>

#define NMAX 100005

using namespace std;

int n,m,st,dr,L;
int x[NMAX],elem[NMAX],prec[NMAX];

inline void write(int poz)
{
    if (prec[poz])write(prec[poz]);
    printf("%d ",x[elem[poz]]);
}
inline int bs(int el)
{
    int poz=0,p=1;
    while (p*2<L)p<<=1;
    for (;p;p>>=1)
      if (poz+p<=L && x[elem[poz+p]]>el)
        poz+=p;
   return poz;
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    scanf("%d",&n);

    for (int i=1;i<=n;i++)
    {
        scanf("%d",&x[i]);
        if (x[i]>x[elem[L]])
         {elem[++L]=i;
          prec[i]=elem[L-1];
          continue;
         }
        int poz=bs(x[i]);
        prec[i]=elem[poz-1];
        elem[poz]=i;
    }
    printf("%d\n%d ",L,x[elem[1]]);
    write(L);

    fclose(stdin);
    fclose(stdout);
}