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