Pagini recente » Cod sursa (job #1791945) | Cod sursa (job #67453) | Clasament testare_olimpiada | Istoria paginii runda/oni_gim2016 | Cod sursa (job #1790577)
#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], 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 i = x;
while(i<=n)
{
if(d[pos] > d[aib[i]])
aib[i] = pos;
i += (i&-i);
}
}
inline int query(int ind)
{
int pos = 0;
while(ind > 0)
{
if(d[pos] < d[aib[ind]])
pos = aib[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);
}
for(i=1; i<=n; ++i)
if(d[i] > maxs)
maxs = d[i], pos = i;
printf("%d\n", maxs);
scrie(pos);
return 0;
}