Pagini recente » Cod sursa (job #368423) | Cod sursa (job #586232) | Cod sursa (job #1072105) | Cod sursa (job #2358899) | Cod sursa (job #945036)
Cod sursa(job #945036)
#include <cstdio>
#include <cstring>
using namespace std;
int a[100001], poz[100001], ss[100001],solutie[10000],bucur,b,Max,pp;
int cbin(int Q[], int q)
{
int p=0,s,dr,m;
s=1; dr=Q[0];
while(s<=dr && p==0)
{
m=(s+dr)/2;
if(Q[m]==q) p=m;
else if(Q[m]>q) dr=m-1;
else s=m+1;
}
if(p==0) return s;
return p;
}
int main()
{
int n, i, j, nr=0;
bool ok;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for (i=1; i<=n; i++) scanf("%d",&a[i]);
ss[1]=a[1];
ss[0]=1;
poz[1]=1;
for(i=2;i<=n;i++)
{
if(a[i]>ss[ss[0]])
{
ss[0]++;
ss[ss[0]]=a[i];
poz[i]=ss[0];
}
else {poz[i]=cbin(ss,a[i]); ss[poz[i]]=a[i];}
if(poz[i]>Max) {Max=poz[i]; pp=i;}
}
bucur=poz[pp];
b=0;
printf("%d\n",Max);
solutie[++b]=a[pp];
for(i=pp-1;i>=1;i--)
if(poz[i]==bucur-1 &&poz[i]<bucur)
{
solutie[++b]=a[i];
bucur=poz[i];
}
for(i=b;i>=1;i--)
printf("%d ",solutie[i]);
return 0;
}