Pagini recente » Cod sursa (job #2685417) | Cod sursa (job #2476124) | Cod sursa (job #1672753) | Cod sursa (job #551231) | Cod sursa (job #1570536)
#include <fstream>
#include <map>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[100001],i,dp[100001],n,j,sol[100001],k,aib[100001],aux[100001];
map <int,int> mymap,inv;
void update(int poz, int val)
{
while(poz<=n)
{
aib[poz]=max(val, aib[poz]);
poz+=(poz&(-poz));
}
}
int query(int poz)
{
int rez=aib[poz];
while(poz>0)
{
poz-=(poz&(-poz));
rez=max(rez,aib[poz]);
}
return rez;
}
int main()
{
fin>>n;
for(i=1;i<=n;i++)
{
fin>>a[i]; aux[i]=a[i];
}
sort(aux+1,aux+n+1);
for(i=1;i<=n;i++)
{
mymap[aux[i]]=i;
inv[i]=aux[i];
}
for(i=1;i<=n;i++)
a[i]=mymap[a[i]];
dp[1]=1;
update(a[1], dp[1]);
for(i=2;i<=n;i++)
{
dp[i]=1+query(a[i]-1);
update(a[i],dp[i]);
}
int maxi=0,pmax=0;
for(i=1;i<=n;i++)
if(dp[i]>maxi) maxi=dp[i],pmax=i;
fout<<maxi<<'\n';
sol[++k]=a[pmax];
for(i=pmax-1;i>=1;--i)
{
if(dp[pmax]==dp[i]+1 && a[i]<a[pmax]) { sol[++k]=a[i]; pmax=i;}
}
for(i=k;i>=1;--i)
fout<<inv[sol[i]]<<" ";
return 0;
}