Pagini recente » Cod sursa (job #437889) | Cod sursa (job #3175766) | Cod sursa (job #1603755) | Cod sursa (job #1592388) | Cod sursa (job #2180519)
#include <cstdio>
#include <iostream>
#include <stack>
using namespace std;
int n,vCit[100005],v1[100005],v2[100005];
stack<int> r;
int caut(int st,int dr,int val)
{
int mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(v1[mij]<val)
st=mij+1;
else
dr=mij-1;
}
mij=(st+dr)/2;
if(v1[mij]<val)
return mij+1;
return mij;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
int idx=1,rasp=1;
v1[1]=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
scanf("%d",&vCit[i]);
idx=caut(1,rasp,vCit[i]);
v1[idx]=vCit[i];
v2[i]=idx;
rasp=max(rasp,idx);
}
printf("%d\n",rasp);
for(int i=n;i>=1;i--)
{
if(v2[i]==rasp)
{
r.push(vCit[i]);
rasp--;
}
}
while(!r.empty())
{
printf("%d ",r.top());
r.pop();
}
return 0;
}