Pagini recente » Cod sursa (job #1542879) | Cod sursa (job #1083607) | Cod sursa (job #1470938) | Cod sursa (job #1573783) | Cod sursa (job #1008680)
#include <cstdio>
#include <algorithm>
#define N 100005
#define zeros(x) (((x)^(x-1))&(x))
using namespace std;
struct nr
{
int x, y;
bool operator < (const nr &e) const
{
return x>e.x;
}
};
nr a[N], b[N];
int aib[N], d[N], nxt[N];
void update(int poz, int val)
{
for(;poz<N;poz+=zeros(poz))
{
if(d[val]>d[aib[poz]])
{
aib[poz]=val;
}
}
}
int query(int poz)
{
int ret=0;
for(;poz;poz-=zeros(poz))
{
if(d[aib[poz]]>d[ret])
{
ret=aib[poz];
}
}
return ret;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int n, i, k=1, sol=0;
scanf("%d", &n);
for(i=1;i<=n;i++)
{
scanf("%d", &a[i].x);
b[i].x=a[i].x;
b[i].y=i;
}
sort(b+1, b+n+1);
for(i=1;i<=n;i++)
{
if(b[i].x!=b[i-1].x) k++;
a[b[i].y].y=k;
}
for(i=n;i>0;i--)
{
//nxt[i]=query(a[i].y-1);
d[i]=d[nxt[i]]+1;
if(d[i]>d[sol])
{
sol=i;
}
update(a[i].y, i);
}
printf("%d\n", d[sol]);
if(sol) for(i=sol;d[sol];i=nxt[i], d[sol]--)
{
printf("%d ", a[i].x);
}
}