Pagini recente » Cod sursa (job #1428641) | Cod sursa (job #1137835) | Cod sursa (job #316945) | Cod sursa (job #2394749) | Cod sursa (job #2263833)
#include <bits/stdc++.h>
#define val first
#define pos second
using namespace std;
bool comp(pair <int,int> a,pair <int,int> b)
{
if(a.val==b.val)
return a.pos>b.pos;
return a.val<b.val;
}
pair <int,int> v[100001],rez[100001],aib[100001];
int n,fcsb[100001];
vector <int> sir;
int zeros(int x)
{
return (x^(x-1))&x;
}
void update(int i,int x)
{
for(int ct=i; ct<=n; ct+=zeros(ct))
if(x>aib[ct].val)
aib[ct]={x,i};
}
pair <int,int> query(int i)
{
pair <int,int> z={0,0};
for(int ct=i; ct>0; ct-=zeros(ct))
if(aib[ct].val>z.val)
z={aib[ct].val,aib[ct].pos};
return z;
}
int main()
{
int i,lgmax,p;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d",&v[i].val);
v[i].pos=i;
fcsb[i]=v[i].val;
}
sort(v+1,v+1+n,comp);
lgmax=0;
p=0;
for(i=1; i<=n; i++)
{
pair <int,int> z;
z=query(v[i].pos);
rez[v[i].pos]={z.val+1,z.pos};
update(v[i].pos,rez[v[i].pos].val);
if(rez[v[i].pos].val>lgmax)
{
lgmax=rez[v[i].pos].val;
p=v[i].pos;
}
}
while(p>0)
{
sir.push_back(fcsb[p]);
p=rez[p].pos;
}
printf("%d\n",lgmax);
while(!sir.empty())
{
printf("%d ",sir.back());
sir.pop_back();
}
return 0;
}