Cod sursa(job #1608759)

Utilizator sucureiSucureiRobert sucurei Data 22 februarie 2016 12:38:22
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<iostream>
#include<fstream>
using namespace std;
ifstream  in("scmax.in");
ofstream out("scmax.out");
int const N=100005;
int n,k,v[N],best[N],p[N],L[N];
void print(int x)
{
    if(p[x]>0) print(p[x]);
    out<<v[x]<<" ";
}
int caut(int x)
{
   int l, r, m;
   l=0;r=k;m=(l+r)/2;
   while(l<=r)
   {
      if (v[L[m]] < x &&  v[L[m+1]] >= x) return m;
      if (v[L[m+1]] < x)
        l=m+1 , m=(l+r)/2;
      else
        r=m-1 , m=(l+r)/2;
   }
   return k;
}
int main()
{
    in>>n;
    for(int i=1;i<=n;i++)
        in>>v[i];
    k=1; best[1]=1; L[1]=1; L[0]=0;
    int poz;
    for(int i=2;i<=n;i++)
    {
        poz=caut(v[i]);
        p[i]=L[poz];
        best[i]=poz+1;
        if(k<best[i]) k=best[i];
        L[poz+1]=i;
    }
    int maxi=0;poz=0;
    for(int i=1;i<=n;i++)
        if(maxi<best[i])
            maxi=best[i],poz=i;
    out<<maxi<<"\n";
    print(poz);
    return 0;
}