Pagini recente » Cod sursa (job #278525) | Cod sursa (job #352791) | Cod sursa (job #1127961) | Cod sursa (job #506695) | Cod sursa (job #543629)
Cod sursa(job #543629)
#include <cstdio>
#include <cassert>
#define Nmax 100005
#define InFile "scmax.in"
#define OutFile "scmax.out"
using namespace std;
int n, q, lg, w;
int Q[Nmax], P[Nmax], T[Nmax], sl[Nmax];
void read();
void solve();
int place (int st, int dr, int val);
void write();
int main()
{
assert (freopen (InFile, "r", stdin));
assert (freopen (OutFile, "w", stdout));
read();
solve();
write();
return 0;
}
void read()
{
int i;
scanf ("%d\n", &n);
for (i=1; i<=n; i++)
scanf ("%d ", &T[i]);
}
void solve ()
{
int i, pas;
//first step
q=0;
for (i=1; i<=n; i++)
{
P[i]=place (1, q, T[i]);
Q[P[i]]=T[i];
if (P[i]==q+1) q++;
}
//second step
lg=q; pas=q; w=1;
for (i=n; i>0; i--)
if (P[i]==pas && pas!=0)
{
pas--;
sl[w++]=T[i];
}
}
int place (int st, int dr, int val)
{
int mij, p=dr+1;
while (st<=dr)
{
mij=st+(dr-st)/2;
if (Q[mij]>=val)
{
p=mij;
dr=mij-1;
}
else
st=mij+1;
}
return p;
}
void write()
{
int i;
printf ("%d\n", lg);
for (i=w-1; i>0; i--)
printf ("%d ", sl[i]);
printf ("\n");
}