Pagini recente » Cod sursa (job #2400387) | Cod sursa (job #422960) | Cod sursa (job #2862651) | Cod sursa (job #2583195) | Cod sursa (job #1232057)
#include <cstdio>
#include <algorithm>
#define putere(x) (x)&(-x)
using namespace std;
struct structura
{
int x,poz;
bool operator <(const structura &aux) const
{
return x<aux.x;
}
}v1[100010];
int aib[100010],v[100010],sol[100010],rez[100010],n,i,nr,maxx,a,s;
void aib_update(int poz,int s)
{
int i;
for(i=poz;i<=n;i+=putere(i)) aib[i]=max(aib[i],s);
}
int aib_query(int poz)
{
int s=0,i;
for(i=poz;i>0;i-=putere(i)) s=max(s,aib[i]);
return s;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&v[i]);
v1[i].x=v[i];
v1[i].poz=i;
}
sort(v1+1,v1+1+n);
for(i=1;i<=n;i++)
{
s=aib_query(v1[i].poz)+1;
sol[v1[i].poz]=s;
aib_update(v1[i].poz,s);
if(maxx<s) {maxx=s;a=v1[i].poz;}
}
rez[++nr]=v[a];
for(i=a;i;i--)
if(sol[i]==sol[a]-1 && v[i]<=v[a])
{
if(v[i]<rez[nr]) rez[++nr]=v[i];
a=i;
}
printf("%d\n",nr);
for(i=nr;i;i--) printf("%d ",rez[i]);
return 0;
}