Pagini recente » Cod sursa (job #362268) | Cod sursa (job #842289) | Cod sursa (job #1729566) | Cod sursa (job #1878295) | Cod sursa (job #206489)
Cod sursa(job #206489)
#include <cstdio>
#define NMAX 100000
int N,sir[NMAX],lmax,P[NMAX],L[NMAX + 1];
void rd()
{
freopen("scmax.in","r",stdin);
scanf("%d",&N);
for(int i = 0 ; i < N ; scanf("%d",&sir[i++]) );
}
int bsc(int st,int dr,int key)
{
if(st>dr) return 0;
int pos = st, bits = st;
for (; bits <= dr ; bits <<= 1);
for(; bits ; bits >>= 1)
if(pos + bits <= dr & sir[L[pos + bits]] < key) pos += bits;
if(sir[L[pos]] < key) return pos;
else return 0;
}
void dp()
{
L[0] = -1;
for(int i = 0 ; i < N ; ++i)
{
int j = bsc(1,lmax,sir[i]);
P[i] = L[j];
if(j + 1 > lmax) lmax = j + 1, L[j + 1] = i;
else if(sir[L[j+1]] > sir[i])
L[j + 1] = i;
}
}
void wd()
{
freopen("scmax.out","w",stdout);
printf("%d\n",lmax);
int p = L[lmax], st[NMAX], k = 0;
while(p != -1)
{
st[k++] = sir[p];
p = P[p];
}
while(k--)
printf("%d ",st[k]);
}
int main()
{
rd();
dp();
wd();
return 0;
}