Cod sursa(job #1998357)

Utilizator passwordCiaciru Ana Maria password Data 7 iulie 2017 16:03:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[nmax];///date de intrare
int lg[nmax];///lg[i]-lg max a unui subsir terminat in a[i]
int t[nmax];///t[i]-elemem anterior lui a[i] in subsir
int q[nmax],nq;///vector sc

void Read()
{int i;
 fin>>n;
 for(i=1;i<=n;i++)
    fin>>a[i];
}

int Find(int x)
{int s,d,m;
 s=0; d=nq;
 while(s<=d)
 {m=(s+d)/2;
  if(a[q[m]]<x&&a[q[m+1]]>=x) return m;
  else
    if(a[q[m+1]]<x) s=m+1;
    else d=m-1;
  }
 return m;
}

void pd()
{int i,j,poz;
 nq=1;
 lg[1]=q[1]=1;
 for(i=2;i<=n;i++)
   {poz=Find(a[i]);
    t[i]=q[poz];
    lg[i]=poz+1;
    q[poz+1]=i;
    if(nq<poz+1) nq=poz+1;
   }
}


void Write(int x)
{if(t[x]!=0) Write(t[x]);
 fout<<a[x]<<" ";
}

void Solve()
{int i;
 int imax,lgmax=0;
 for(i=1;i<=n;i++)
    if(lg[i]>lgmax)
     {lgmax=lg[i];
      imax=i;}
 fout<<lgmax<<"\n";
 Write(imax);
 fout<<endl;
}

int main()
{Read();
 pd();
 Solve();
 return 0;
}