Cod sursa(job #206488)

Utilizator mika17Mihai Alex Ionescu mika17 Data 7 septembrie 2008 10:46:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
#define NMAX 100000

using namespace std;

int N,sir[NMAX],lmax,P[NMAX],L[NMAX + 1];

void rd()
{
    freopen("scmax.in","r",stdin);
    scanf("%d",&N);
    for(int i = 0 ; i < N ; scanf("%d",&sir[i++]) );
}

int bsc(int st,int dr,int key)
{
 if(st>dr) return 0;

 int pos = st, bits = st;

 for (; bits <= dr ; bits <<= 1);

 for(; bits ; bits >>= 1)
    if(pos + bits <= dr & sir[L[pos + bits]] < key) pos += bits;
 if(sir[L[pos]] < key) return pos;
  else return 0;
}

void dp()
{

 L[0] = -1;
 for(int i = 0 ; i < N ; ++i)
 {
    int j = bsc(1,lmax,sir[i]);

    P[i] = L[j];

    if(j + 1 > lmax) lmax = j + 1, L[j + 1] = i;
     else if(sir[L[j+1]] > sir[i])
                L[j + 1] = i;

 }
}

void wd()
{
 freopen("scmax.out","w",stdout);
 printf("%d\n",lmax);

 int p = L[lmax], st[NMAX], k = 0;
 while(p != -1)
   {
    st[k++] = sir[p];
    p = P[p];
   }
 while(k--)

  printf("%d ",st[k]);
}

int main()
{
 rd();
 dp();
 wd();
 return 0;
}