Cod sursa(job #1424706)

Utilizator akaprosAna Kapros akapros Data 25 aprilie 2015 13:23:55
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#define Nmax 100005
using namespace std;
int n,i,j,v[Nmax],k,p;
int ultim[Nmax],nr,w[Nmax];
int cb(int x)
{
    int st=1,dr=nr,mij;
    while (st <= dr)
    {
         mij=(st+dr)/2;
         if (v[ultim[mij]]>x && v[ultim[mij-1]]<=x) return mij;
         if (v[ultim[mij]]<x)
         st=mij+1;
         else dr=mij-1;
    }
    return 0;
}
int sol[Nmax];
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]);
          if (i==1)
          {
               ultim[++nr]=i;
               continue ;
          }
          if (v[i]>v[ultim[nr]])
          {
               w[i]=ultim[nr];
               ultim[++nr]=i;
               k=i;
          }else
          {
               p=cb(v[i]);
               //if (p==0) ++p;
               ultim[p]=i;
               w[i]=p-1;
          }
     }
     printf("%d\n",nr);
     while (k)
     {
         sol[++sol[0]]=v[k];
         k=w[k];
     }
     for (i=sol[0];i>=1;--i)
     printf("%d ",sol[i]);
     return 0;
}