Pagini recente » Cod sursa (job #2936728) | Cod sursa (job #1332380) | Cod sursa (job #5526) | Cod sursa (job #1631938) | Cod sursa (job #749919)
Cod sursa(job #749919)
# include <fstream>
# include <iostream>
# include <algorithm>
# define DIM 100003
using namespace std;
struct nod{
int v, i;
nod(){}
nod(int V, int I){
v=V;i=I;}
friend bool operator < (const nod &a, const nod &b){
return a.v<b.v;
}
}w[DIM];
int n, m, 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>>w[i].v;
w[i].i=i;
e[i]=w[i].v;
}
}
void uniform ()
{
sort(w+1, w+n+1);
for(int i=1;i<=n;++i)
if (w[i].v!=w[i-1].v)
v[w[i].i]=++m;
else
v[w[i].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()
{
b[v[1]]=1;
upd(v[1],1);
for(int i=2;i<=n;++i)
{
int poz=query(v[i]-1);
if (poz)
{
p[i]=poz;
b[v[i]]=max(b[v[poz]]+1,b[v[i]]);
}
else
b[v[i]]=max(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;
}