Pagini recente » Cod sursa (job #1881209) | Cod sursa (job #350431) | Cod sursa (job #1503234) | Cod sursa (job #3199275) | Cod sursa (job #2462647)
#include <fstream>
using namespace std;
//l[i]=liungimea celui mai lung subsir crescator care se termina pe pozitia i
//l[i]=1+max(l[j] cu proprietatile: o<j<i si v[j]<v[i]
const int MAX=100006;
int a[MAX],n,pred[MAX],pozmin[MAX],lmax,l;
ifstream in("scmax.in");
ofstream out("scmax.out");
int cautbinar(int val)
{
int r=0;
int pas=1<<16;
while(pas!=0)
{
if(r+pas<=lmax && a[pozmin[r+pas]]<val) r+=pas;
pas/=2;
}
return r;
}
void subsir(int p)
{
if(pred[p]!=0) subsir(pred[p]);
out<<a[p]<<" ";
}
int main()
{
in>>n;
for(int i=1; i<=n; i++) in>>a[i];
//imax=1;
pozmin[++lmax]=1;
for(int i=2; i<=n; i++)
{
l=cautbinar(a[i]);
pred[i]=pozmin[l];
if(l+1>lmax) lmax=l+1;
pozmin[l+1]=i;
}
out<<lmax<<'\n';
subsir(pozmin[lmax]);
return 0;
}