Pagini recente » Cod sursa (job #1026342) | Cod sursa (job #2080738) | Cod sursa (job #1637090) | Cod sursa (job #1012548) | Cod sursa (job #1909719)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define lim 10010
int n,ini[lim],dr,v[lim],aib[lim],maxm,act,dad[lim];
int b_s(int val)
{
int pos=0,mask;
for(mask=1; mask<=n; mask<<=1);
for(; mask; mask>>=1)
if(pos+mask<=n)
if(aib[pos+mask]<=val)
pos+=mask;
return pos;
}
void normalizare()
{
sort(aib+1,aib+n+1);
for(int i=1; i<=n; i++)
v[i]=b_s(ini[i]);
}
void initializare()
{
for(int i=1; i<=n; i++)
aib[i]=0;
}
int query(int posini)
{
int rez=0;
for(int pos=posini-1; pos; pos-=(pos&(-pos)))
{
if(aib[pos]>=rez)
{
rez=aib[pos];
if(v[pos]!=v[posini])
dad[posini]=pos;
else
dad[posini]=dad[pos];
}
}
return rez;
}
void update(int pos, int val)
{
for(; pos<=n; pos+=(pos&(-pos)))
aib[pos]=max(aib[pos],val);
}
void drum(int k)
{
if(dad[k])
{
drum(dad[k]);
fout<<ini[k]<<' ';
}
else
fout<<ini[k]<<' ';
}
int main()
{
fin>>n;
for(int i=1; i<=n; i++)
fin>>ini[i], aib[i]=ini[i];
normalizare();
initializare();
maxm=-1;
for(int i=1; i<=n; i++)
{
act=query(v[i])+1;
if(act>maxm)
maxm=act, dr=i;
update(v[i],act);
}
fout<<maxm<<'\n';
drum(dr);
// for(int i=1; i<=n; i++)
// fout<<dad[i]<<' ';
fin.close();
fout.close();
return 0;
}