Pagini recente » Cod sursa (job #908270) | Cod sursa (job #1529695) | Cod sursa (job #1741000) | Cod sursa (job #808950) | Cod sursa (job #2002903)
#include <fstream>
#define MAX 100001
using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");
int n,v[MAX],dp[MAX],prec[MAX],L[MAX],nr;
void afisare(int poz)
{
if (prec[poz]>0)
afisare(prec[poz]);
fo<<v[poz]<<" ";
}
int cautare_binara(int x)
{
int st=0,dr=nr+1;
while (dr-st>1)
{
int mij=(st+dr)/2;
if (x>=v[L[mij]])
st=mij;
else
dr=mij;
}
if (v[L[st]]==x)
st--;
if (v[L[st]]<x&&v[L[st+1]]>=x)
return st;
return nr;
}
int main()
{
fi.sync_with_stdio(false);
fo.sync_with_stdio(false);
///v[]=numerele, prec[]=indicele elem. precedent,
///dp[]=lungimea maxima, L[]=?
fi>>n;
for (int i=1; i<=n; i++)
fi>>v[i];
dp[1]=L[1]=1;
L[0]=0;
nr=1;
for (int i=2; i<=n; i++)
{
int poz=cautare_binara(v[i]);
prec[i]=L[poz];
dp[i]=poz+1;
L[poz+1]=i;
nr=max(nr,poz+1);
}
int maxim=0,poz=0;
for (int i=1; i<=n; i++)
if (dp[i]>maxim)
maxim=dp[i],poz=i;
fo<<maxim<<"\n";
afisare(poz);
fi.close();
fo.close();
return 0;
}