Pagini recente » Cod sursa (job #1484285) | Cod sursa (job #2617341) | Cod sursa (job #2383899) | Cod sursa (job #2444153) | Cod sursa (job #719795)
Cod sursa(job #719795)
#include<cstdio>
#include<stack>
#define _AMAX 100010
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
static int nA, A[_AMAX];
scanf("%d",&nA);
for (int i=1;i<=nA;i++)
scanf("%d",&A[i]);
static int M[_AMAX]; int L=0;
static int prev[_AMAX];
for (int i=1;i<=nA;i++)
{
//binary search for largest j<=L w/ A[M[j]]<A[x]
int left=0, right=L, val=A[i],j=0;
while (left<=right)
{
int mid=(left+right)/2;
if (A[M[mid]]<val&&(mid==L||A[M[mid+1]]>=val)) {j=mid;break;}
if (A[M[mid]]>=val) right=mid-1;
else left=mid+1;
}//got j
prev[i]=M[j];
if (j==L||A[i]<A[M[j+1]])
{
M[j+1]=i;
if (j+1>L) L=j+1;
}
}
std::stack<int> sol;
int cur=M[L];
while(cur!=0)
{
sol.push(A[cur]);
cur=prev[cur];
}
printf("%d\n",L);
while (!sol.empty())
{
printf("%d ",sol.top());
sol.pop();
}
return 0;
}