Pagini recente » Cod sursa (job #638794) | Cod sursa (job #2819483) | Cod sursa (job #1313093) | Cod sursa (job #645249) | Cod sursa (job #727255)
Cod sursa(job #727255)
#include <fstream>
#define nmax 100004
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int T[nmax],P[nmax],V[nmax],L,N;
void Afiseaza(int p)
{
if(T[p])
Afiseaza(T[p]);
out<<V[p]<<' ';
}
inline int Cauta(int key)
{
int st,step,i;
for(st=1;st<L;st<<=1);
for(step=st,i=0;step;step>>=1)
if(i+step<=L&&V[P[i+step]]<key)
i+=step;
return i;
/*int i,q;
for(i=01;i<=L;i++)if(V[P[i]]>=key)return i-1;
return L;*/
}
int main()
{
int i,poz;
in>>N;
for(i=1;i<=N;i++)
in>>V[i];
//L = lungimea sibusirului crescator maximal
//P[i] = pozitia ultimului element din subsirul crescator de lungime i
P[L=1]=1;
for(i=2;i<=N;i++)
{
poz = Cauta(V[i]);
//out<<poz<<' ';
if(poz==L)
P[++L]=i;
else if(V[P[poz+1]]>V[i])//il micsorez pe urmatorul
P[poz+1]=i;
T[i]=P[poz];
}
out<<L<<'\n';
Afiseaza(P[L]);
return 0;
}