Cod sursa(job #1786506)

Utilizator anamaria41Raicu Ana anamaria41 Data 23 octombrie 2016 07:26:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <stdio.h>

using namespace std;
int n,i,v[100050],poz[100050],q[100050],aux[100050],m;
int nr;
int cbin(int x,int st,int dr)
{
 int mij;
 while (st<dr)
 {
     mij=(st+dr)/2;
     if (q[mij]<x)st=mij+1;
     else dr=mij;
 }
 if(q[st]>=x)
 return st;
 else return st+1;
}

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

    scanf("%d", &n);

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

    m=poz[1]=1;
    q[m]=v[1];

    for(i=2;i<=n;i++)
    {
      if(v[i]>q[m])
     {q[++m]=v[i];
             poz[i]=m;}
       else
       {
       q[cbin(v[i],1,m)]=v[i];
       poz[i]=cbin(v[i],1,m);}
    }

    printf("%d\n", m);
    nr=m;
    for(i=n;i>=1;i--)
    { if(poz[i]==m){aux[m]=v[i];m--;}

    }
    for(i=1;i<=nr;i++)
    printf("%d ",aux[i]);

    return 0;
}