Pagini recente » Cod sursa (job #1147830) | Cod sursa (job #1911937) | Cod sursa (job #2368602) | Cod sursa (job #1318703) | Cod sursa (job #751291)
Cod sursa(job #751291)
# include <fstream>
# include <iostream>
# include <algorithm>
# define DIM 100003
using namespace std;
int n, m, w[DIM], v[DIM], a[DIM], p[DIM], b[DIM], poz[DIM], c[DIM], sol, st;
void read ()
{
ifstream fin ("scmax.in");
fin>>n;
for(int i=1;i<=n;++i)
fin>>v[i], p[i]=i;
}
inline bool cmp (int i, int j)
{
return v[i]<v[j];
}
void uniform ()
{
sort(p+1, p+n+1, cmp);
for(int i=1;i<=n;++i)
if (v[p[i]]!=v[p[i]-1])
w[p[i]]=++m, c[m]=v[p[i]];
else
w[p[i]]=m;
}
int query (int p)
{
int r=0, e=0;
while(p)
{
if (e<b[a[p]])
e=b[a[p]], r=a[p];
p-=p^(p&(p-1));
}
return r;
}
void upd (int p)
{
int r=p;
a[p]=r;
while(p<=m)
{
if (b[r]>b[a[p]])
a[p]=r;
p+=p^(p&(p-1));
}
}
void solve ()
{
int q;
for(int i=1;i<=n;++i)
{
q=query(w[i]-1);
b[w[i]]=b[q]+1;
poz[w[i]]=q;
upd(w[i]);
if (b[w[i]]>sol)
sol=b[w[i]], st=w[i];
}
}
void print ()
{
ofstream fout ("scmax.out");
fout<<sol<<"\n";
w[0]=0;
while(st)
{
v[++v[0]]=c[st];
st=poz[st];
}
for(int i=sol;i;--i)
fout<<v[i]<<" ";
}
int main ()
{
read ();
uniform ();
solve ();
print();
return 0;
}