Pagini recente » Cod sursa (job #1255451) | Cod sursa (job #1113091) | Cod sursa (job #1242583) | Cod sursa (job #1277490) | Cod sursa (job #1790569)
#include <cstdio>
#include <algorithm>
#define MAXN 100000
struct aa{
int nr, id;
}aux[MAXN+1];
int n, d[MAXN+1], v[MAXN+1], aib[MAXN+1], p[MAXN+1], last[MAXN+1], name[MAXN+1];
bool cmp(const aa &v1, const aa &v2)
{
if(v1.nr == v2.nr)
return (v1.id > v2.id);
return (v1.nr < v2.nr);
}
inline void update(int x, int pos, int val)
{
int i = x;
while(i<=n)
{
if(val > aib[i]){
aib[i] = val;
p[i] = pos;
}
i += (i&-i);
}
}
inline int query(int ind)
{
int m = 0, pos;
while(ind > 0)
{
if(m < aib[ind]){
m = aib[ind];
pos = p[ind];
}
ind -= (ind & -ind);
}
return pos;
}
void scrie(int pos)
{
if(last[pos] != 0)
scrie(last[pos]);
printf("%d ", name[v[pos]]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int r, maxs=-1, pos, i;
scanf("%d", &n);
for(i=1; i<=n; ++i)
scanf("%d", &aux[i].nr), aux[i].id = i;
std::sort(aux+1, aux+n+1, cmp);
for(i=1; i<=n; ++i){
v[aux[i].id] = i;
name[i] = aux[i].nr;
}
for(i=1; i<=n; ++i){
r = query(v[i]-1);
d[i] = d[r] + 1;
last[i] = r;
update(v[i], i, d[i]);
}
for(i=1; i<=n; ++i)
if(d[i] > maxs)
maxs = d[i], pos = i;
printf("%d\n", maxs);
scrie(pos);
return 0;
}