Pagini recente » Cod sursa (job #1439853) | Cod sursa (job #1767637) | Cod sursa (job #127494) | Cod sursa (job #3274567) | Cod sursa (job #2174224)
#include <cstdio>
#include <algorithm>
using namespace std;
int n,v[100010],norm[100010],d[100010],tata[100010],rez[100010];
pair<int,int> aib[100010];
void aib_update(int poz,int val,int poz1)
{
for(int i=poz;i<=n;i+=i&(-i))
if(val>aib[i].first) aib[i]={val,poz1};
}
pair<int,int> aib_query(int poz)
{
pair<int,int> val={0,0};
for(int i=poz;i>0;i-=i&(-i))
if(aib[i].first>val.first) val=aib[i];
return val;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
norm[i]=v[i];
}
sort(norm+1,norm+n+1);
int sol=0,pozz=0;
for(int i=1;i<=n;i++)
{
int poz=lower_bound(norm+1,norm+n+1,v[i])-norm;
pair<int,int> val=aib_query(poz-1);
d[i]=val.first+1;tata[i]=val.second;
aib_update(poz,d[i],i);
if(d[i]>sol) {sol=d[i];pozz=i;}
}
printf("%d\n",sol);
int l=0;
rez[++l]=v[pozz];
while(tata[pozz]!=0)
{
pozz=tata[pozz];
rez[++l]=v[pozz];
}
for(int i=l;i>=1;i--) printf("%d ",rez[i]);
return 0;
}