Pagini recente » Cod sursa (job #553123) | Cod sursa (job #1543692) | Cod sursa (job #1661047) | Cod sursa (job #1828965) | Cod sursa (job #1150791)
#include<fstream>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,v[200001],dp[200001],poz,aib[200001],sol,psol,tata[200001],s[200001];
struct norm
{
int val,poz;
}a[200001];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void citire()
{
//fin>>n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
//fin>>a[i].val;
a[i].poz=i;
}
}
int cmp(norm a,norm b)
{
return a.val<b.val;
}
void normalizare()
{
int nr=0;
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(a[i].val!=a[i-1].val)
{
nr++;
}
v[a[i].poz]=nr;
s[nr]=a[i].val;
}
}
int query(int val)
{
int sol=0,ind=0;
for(int i=val-1;i>=1;i-=(i&(-i)))
{
if(dp[aib[i]]>dp[ind])
{
ind=aib[i];
}
}
return ind;
}
void update(int val,int p)
{
for(int i=val;i<=n;i+=(i&(-i)))
{
if(dp[aib[i]]<dp[p])
{
aib[i]=p;
}
}
}
void afisare(int poz)
{
if(poz!=0)
{
afisare(tata[poz]);
// fout<<s[v[poz]]<<" ";
printf("%d ",s[v[poz]]);
}
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
citire();
normalizare();
for(int i=1;i<=n;i++)
{
poz=query(v[i]);
tata[i]=poz;
dp[i]=dp[poz]+1;
update(v[i],i);
if(dp[i]>sol)
{
sol=dp[i];
psol=i;
}
}
//fout<<sol<<"\n";
printf("%d\n",sol);
afisare(psol);
return 0;
}