Cod sursa(job #1870558)

Utilizator cameleonGeorgescu Dan cameleon Data 6 februarie 2017 19:03:15
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<fstream>
using namespace std;
#define fin "scmax.in"
#define fout "scmax.out"
#define nmax 100010

ifstream f(fin);
ofstream g(fout);

long a[nmax],l[nmax],s[nmax],n,sol[nmax];
void read()
{
f>>n;
for(long i=1;i<=n;i++)f>>a[i];
f.close();
}
long poz(long p,long u,long x)
{
while(p<=u)
    {
    int mij=(p+u)/2;
    if(x==s[mij]) return mij;
    else
         if(x<s[mij])u=mij-1;
         else p=mij+1;
    }
return p;
}
void dinamic()
{
s[1]=a[1];l[1]=1;
long p=1,u=1,i,ii=1;long max=l[1];
for(i=2;i<=n;i++)
    {
    int k=poz(p,u,a[i]);
    if(k>u)u=k;
    s[k]=a[i];l[i]=k;
    if(l[i]>max){max=l[i];ii=i;}
    }
long lung=max;i=ii;
while(lung>0)
{
    if(l[i]==lung)
     {
     sol[lung]=a[i];
     lung--;
     }
  i--;
  }
g<<max<<'\n';
for(i=1;i<=max;i++)
    g<<sol[i]<<" ";
g.close();
}
int main()
{
read();
dinamic();
return 0;
}