Pagini recente » Cod sursa (job #192392) | Cod sursa (job #1762813) | Cod sursa (job #2811089) | Cod sursa (job #394791) | Cod sursa (job #1275249)
# include <cstdio>
# define N 100010
# define ultim(x) x[0]
# define mij ((l+r)>>1)
using namespace std;
int n,Max,pozitie;
int a[N],st[N],poz[N],sol[N];
int bs(int x)
{
int find=0,l,r;
l=1; r=ultim(st);
while(l<=r && find==0)
{
if(st[mij]==x) find=mij;
else if(st[mij]>x) r=mij-1;
else l=mij+1;
}
if(find==0) return l;
return find;
}
void load()
{
freopen("scmax.in", "r", stdin);
scanf("%d\n", &n);
for(int i=1; i<=n; ++i)
scanf("%d ", &a[i]);
fclose(stdin);
return;
}
void solve()
{
for(int i=1; i<=n; ++i)
{
if(a[i]>st[ultim(st)])
{
st[++ultim(st)]=a[i];
poz[i]=ultim(st);
}
else
{
poz[i]=bs(a[i]);
st[poz[i]]=a[i];
}
if(Max<poz[i])
{
Max=poz[i];
pozitie=i;
}
}
return;
}
void write()
{
freopen("scmax.out", "w", stdout);
int curent=poz[pozitie];
printf("%d\n", curent);
sol[++ultim(sol)]=a[pozitie];
for(int i=pozitie-1; i; --i)
if(poz[i]==curent-1)
{
sol[++ultim(sol)]=a[i];
curent=poz[i];
}
for(int i=ultim(sol); i>=1; --i)
printf("%d ", sol[i]);
fclose(stdout);
return;
}
int main()
{
load();
solve();
write();
}