Pagini recente » Cod sursa (job #2192516) | Cod sursa (job #3197304) | Cod sursa (job #1066512) | Cod sursa (job #449104) | Cod sursa (job #1646861)
#include <bits/stdc++.h>
#define lastbit(x) (x&(-x))
using namespace std;
const int Nmax = 1e5 + 10;
int n , i , ans , last;
int a[Nmax] , bst[Nmax] , aib[Nmax];
vector < int > Norm , v;
void update(int i , int x)
{
for ( ; i <= n; i += lastbit(i))
aib[i] = max(aib[i] , x);
}
int query(int i)
{
int ret = 0;
for ( ; i ; i -= lastbit(i))
ret = max(ret , aib[i]);
return ret;
}
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]);
Norm.push_back(a[i]);
}
sort(Norm.begin() , Norm.end());
auto it = unique(Norm.begin() , Norm.end());
Norm.resize(distance(Norm.begin() , it));
for (i = 1; i <= n; ++i)
a[i] = lower_bound(Norm.begin() , Norm.end() , a[i]) - Norm.begin() + 1;
for (i = 1; i <= n; ++i)
{
bst[i] = query(a[i] - 1) + 1;
ans = max(ans , bst[i]);
update(a[i] , bst[i]);
}
last = n + 1; a[n+1] = n + 1; bst[n+1] = ans + 1;
for (i = n; i ; --i)
{
if (bst[i] + 1 != bst[last] || a[i] >= a[last])
continue;
v.push_back(Norm[a[i]-1]);
last = i;
}
printf("%d\n", ans);
for (auto it = v.rbegin(); it != v.rend(); ++it)
printf("%d ", *it);
return 0;
}