Pagini recente » Cod sursa (job #3032723) | Cod sursa (job #3269896) | Cod sursa (job #665999) | Cod sursa (job #2041993) | Cod sursa (job #905494)
Cod sursa(job #905494)
#include <cstdlib>
#include <cstdio>
#include <set>
using namespace std;
struct sp
{
int val,sol;
sp()
{
val=0;
sol=0;
}
sp(int a,int b)
{
val=a;
sol=b;
}
};
class cmp
{
public:
inline bool operator ()(sp a,sp b)
{
return a.val<b.val;
}
};
set<sp,cmp> s;
pair< set<sp,cmp>::iterator ,bool> ret;
int v[100100];
int n;
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
s.insert(sp());
s.insert( sp(v[1],1) );
for(int i=2;i<=n;i++)
{
set<sp,cmp>::iterator it,it2,it3;
it=s.upper_bound( sp(v[i],0) );
it2=it;
advance(it2,-1);
ret=s.insert( sp(v[i], (*it2).sol+1) );
it=ret.first;
it2=it;
it3=it;
advance(it2,-1);
advance(it3,1);
if((*it).sol==(*it2).sol)
{
s.erase(it);
}
else
{
if(it3!=s.end())
{
if((*it).sol==(*it3).sol)
s.erase(it3);
}
}
}
printf("%d\n",s.size()-1);
set<sp,cmp>::iterator it=s.begin();
advance(it,1);
for(it;it!=s.end();++it)
printf("%d ",(*it).val);
}