Pagini recente » Cod sursa (job #197677) | Rating Freya Watson (5milac381wa9) | Cod sursa (job #340563) | Cod sursa (job #103951) | Cod sursa (job #1995245)
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
const int nmax=100005;
stack<int> st;
struct al
{
int x,i;
}v[nmax];
int arb[4*nmax+55],poz,val,maxval,d[nmax];
inline bool cmp(al a,al b)
{
if(a.x==b.x)
return b.i<a.i;
return a.x<b.x;
}
inline int max(int a,int b)
{
if(a>b)
return a;
return b;
}
inline void update(int node,int st,int dr)
{
if(st==dr)
{
arb[node]=val;
return;
}
int med=((dr-st)>>1) + st;
if(poz>med)
update(node<<1|1,med+1,dr);
else
update(node<<1,st,med);
arb[node]=max(arb[node<<1],arb[node<<1|1]);
}
inline void query(int node,int st,int dr)
{
if(1<=st&&dr<=poz)
{
maxval=max(maxval,arb[node]);
return;
}
int med=((dr-st)>>1)+st;
if(st<=poz)
query(node<<1,st,med);
if(med<poz)
query(node<<1|1,med+1,dr);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&v[i].x),v[i].i=i;
sort(v+1,v+n+1,cmp);
int maxim=0;
for(i=1;i<=n;++i)
{
maxval=0;
poz=v[i].i;
query(1,1,n);
d[i]=maxval+1;
poz=v[i].i;
val=d[i];
update(1,1,n);
if(val>maxim)
maxim=val;
}
printf("%d\n",maxim);
int previ=n+1;
for(i=n;i;--i)
if(d[i]==maxim&&previ>v[i].i)
{
previ=v[i].i;
maxim--;
st.push(v[i].x);
}
while(!st.empty())
{
printf("%d ",st.top());
st.pop();
}
}