Pagini recente » Cod sursa (job #1514563) | Cod sursa (job #2383875) | Cod sursa (job #111101) | Cod sursa (job #927314) | Cod sursa (job #1690128)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define INF numeric_limits<int>::max()
#define int64 long long
#define lsb(x) (-x)&(x)
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
set<int> S;
int nrm[100010],n,a[100010],m,bit[100010],dp[100010];
bool use[100010];
int bin_search(int x)
{
int left=1,right=m;
while(left<=right)
{
int mid=(left+right)/2;
if(nrm[mid]==x)
return mid;
if(nrm[mid]>x)
right=mid-1;
else
left=mid+1;
}
return (left+right)/2;
}
void update(int pos)
{
for(int i=pos;i<=n;i+=lsb(i))
bit[i]++;
}
int sum(int pos)
{
int s=0;
for(int i=pos;i>0;i-=lsb(i))
s+=bit[i];
return s;
}
void afis(int pos,int k)
{
while(dp[pos]!=k && pos>0)
pos--;
if(k-1!=0)
afis(pos-1,k-1);
out<<a[pos]<<' ';
}
int main()
{
in>>n;
for(int i=1;i<=n;i++)
{
in>>a[i];
S.insert(a[i]);
}
for(auto it: S)
nrm[++m]=it;
int sol=0,pos=0;
for(int i=1;i<=n;i++)
{
int x=bin_search(a[i]);
if(use[x]==false)
{
update(x);
use[x]=true;
}
dp[i]=sum(x);
if(dp[i]>sol)
{
sol=dp[i];
pos=i;
}
}
out<<sol<<'\n';
afis(pos,sol);
return 0;
}