Pagini recente » Cod sursa (job #2233129) | Cod sursa (job #2143197) | Cod sursa (job #2804714) | Cod sursa (job #1778077) | Cod sursa (job #2632492)
#include <stdio.h>
using namespace std;
const int NMAX=1e5+1, INF1=0, INF2=2e9+1;
int dp[NMAX+1], minn[NMAX+2], arr[NMAX+1], pred[NMAX+1], sir[NMAX+1];
int binar(int val, int sz)
{
bool found=false;
int st=0, dr=sz, mj;
while(st<=dr && !found)
{
mj=(st+dr)/2;
if(arr[minn[mj]]<arr[val] && arr[minn[mj+1]]>=arr[val])
found=true;
else if(arr[minn[mj]]>=arr[val])
dr=mj-1;
else
st=mj+1;
}
return mj+1;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int N, sz=0;
scanf("%d", &N);
for(int i=1;i<=N;++i)
{
scanf("%d", &arr[i]);
minn[i]=N+1;
}
arr[N+1]=INF2;
arr[0]=INF1;
for(int i=1;i<=N;++i)
{
dp[i]=binar(i, sz);
pred[i]=minn[dp[i]-1];
if(dp[i]==sz+1)
minn[++sz]=i;
else
minn[dp[i]]=i;
}
printf("%d\n", sz);
int curent=minn[sz];
while(curent!=0)
{
sir[++sir[0]]=arr[curent];
curent=pred[curent];
}
while(sir[0]!=0)
printf("%d ", sir[sir[0]--]);
return 0;
}