Cod sursa(job #915141)

Utilizator PatrikStepan Patrik Patrik Data 14 martie 2013 19:20:30
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<cstdio>
using namespace std;
#define MAX 100001
#define INF 2000000001
int N , V[MAX] , Q[MAX] , P[MAX] , T[MAX] ,maxim  , nr ;

void citire();
void solve();
void tipar();
void insert(int x , int ls , int ld);
void drum(int x,int i);

int main()
{
    citire();
    solve();
    tipar();
    return 0;
}

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

void solve()
{
    Q[1] = V[1] ;
    P[1] = nr = 1;
    for(int i = 2 ; i <= N ; ++i )
    {
      if(V[i] > Q[nr])
          Q[++nr] = V[i];
      else insert(V[i],0,nr);
      P[i] = nr;
      if(nr > maxim)maxim = nr;
    }
}

void insert(int x ,int ls , int ld )
{
   int m;
   while(ls <= ld)
   {
        m = (ls+ld)/2;
        if(x > Q[m] && x <= Q[m+1])
        {
            Q[m+1] = x;
            nr = m+1;
            return;
        }
        else
        if(x <= Q[m])ld = m;
        else ls = m+1;
   }
}

void tipar()
{
    freopen("scmax.out" , "w" , stdout);
    printf("%d\n" , maxim);
    int aux = maxim;
    for( int i = N ;maxim;i--)
        if(P[i] == maxim )Q[maxim--] = V[i];
    for( int i = 1 ; i <= aux ; ++i )
        printf("%d " , Q[i]);
}