Pagini recente » Cod sursa (job #1413684) | Cod sursa (job #2563522) | Cod sursa (job #13761) | Cod sursa (job #1281989) | Cod sursa (job #1267434)
#include <cstdio>
#include <algorithm>
#define ub(x) x&(-x)
#define nmax 100005
using namespace std;
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
int n,v[nmax],a[nmax],x[nmax];
int aib[nmax],aib2[nmax],maxim[nmax];
int poz,caut,ma,sol[nmax];
void cautbin(int p,int q)
{if (p>q) return;
int mijl=(p+q)>>1;
if (caut<=a[mijl])
{poz=mijl;
cautbin(p,mijl-1);}
else cautbin(mijl+1,q);
}
void normalizare()
{int i;
sort(a+1,a+n+1);
for (i=1;i<=n;i++)
{poz=0;
caut=v[i];
cautbin(1,n);
x[i]=poz+1;
}
}
void update(int x,int val)
{int i;
for (i=x;i<nmax;i+=ub(i)) if (val>aib[i])
{aib[i]=val;
aib2[i]=poz;}
}
int maxulet(int x)
{int m=1,i;
for (i=x;i>=1;i-=ub(i)) if (aib[i]+1>m)
{m=aib[i]+1;
poz=aib2[i];}
return m;
}
int main()
{int i,j;
fscanf(f,"%d",&n);
for (i=1;i<=n;i++) {fscanf(f,"%d",&v[i]);
a[i]=v[i];}
normalizare();
for (i=1;i<=n;i++)
{poz=0;
maxim[i]=maxulet(x[i]-1);
a[i]=poz;
poz=i;
update(x[i],maxim[i]);}
for (i=1;i<=n;i++) if (maxim[i]>ma) {ma=maxim[i];
poz=i;}
fprintf(g,"%d\n",ma);
j=0;
while (poz!=0)
{sol[++j]=v[poz];
poz=a[poz];
}
for (i=j;i>=1;i--) fprintf(g,"%d ",sol[i]);
return 0;
}