Pagini recente » Cod sursa (job #570998) | Cod sursa (job #1969171) | Cod sursa (job #1959341) | Cod sursa (job #505173) | Cod sursa (job #1606610)
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
/*ifstream fin("scmax.in");
ofstream fout("scmax.out");
*/
int i,dp[100001],n,j,sol[100001],k,aib[100001];
struct sir{
int val, poz;
}a[100001];
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;
}
bool cmp(sir a, sir b)
{
if(a.val != b.val) return a.val<b.val;
else return a.poz>b.poz;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for(i=1;i<=n;i++)
{
scanf("%d", &a[i].val); a[i].poz=i;
}
sort(a+1,a+n+1,cmp);
dp[1]=1;
update(a[1].poz, dp[1]);
for(i=2;i<=n;i++)
{
dp[i]=1+query(a[i].poz-1);
update(a[i].poz,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';
printf("%d\n", maxi);
sol[++k]=a[pmax].val;
for(i=pmax-1;i>=1;--i)
{
if(dp[pmax]==dp[i]+1 && a[i].poz<a[pmax].poz) { sol[++k]=a[i].val; pmax=i;}
}
for(i=k;i>=1;--i)
//fout<<sol[i]<<" ";
printf("%d ", sol[i]);
return 0;
}