Pagini recente » Cod sursa (job #2071451) | Cod sursa (job #1990242) | Cod sursa (job #1837794) | Cod sursa (job #3178935) | Cod sursa (job #1151943)
#include <cstdio>
#include <algorithm>
#define nmax 100005
#define lsb(a) (a&(-a))
#define maxim(a,b) (a>b)?(a):(b)
using namespace std;
int arb[3*nmax];
int v[nmax],a[nmax],vn[nmax],l[nmax],prec[nmax];
int n,p,lmax,lmp;
int cautbin(int v) {
int s = 1,f = p;
while (s <= f) {
int mij = (s+f)/2;
if (v < a[mij]) f = mij-1;
else if (v == a[mij]) return mij;
else s = mij+1;
}
return s;
}
int query(int pos) {
int r=0,mx = 0;
while (pos > 0) {
if (l[arb[pos]] > mx) {
mx = l[arb[pos]];
r = arb[pos];
}
pos -= lsb(pos);
}
return r;
}
void update(int pos,int val) {
while (pos <= n) {
if (l[arb[pos]] < l[val]) arb[pos] = val;
pos += lsb(pos);
}
}
void print(int p) {
if (prec[p] != 0) {
print(prec[p]);
}
printf("%d ",a[vn[p]]);
}
int main() {
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++) {
scanf("%d",&v[i]);
a[i] = v[i];
}
sort(a+1,a+n+1);
for (int i=1;i<=n;i++) {
if (a[i] != a[i+1]) a[++p] = a[i];
}
for (int i=1;i<=n;i++) {
vn[i] = cautbin(v[i]);
}
for (int i=1;i<=n;i++) {
int q = query(vn[i]-1);
l[i] = l[q]+1;
update(vn[i],i);
prec[i] = q;
if (lmax < l[i]) lmax = l[i],lmp=i;
}
printf("%d\n",lmax);
print(lmp);
printf("\n");
return 0;
}