Pagini recente » Cod sursa (job #1584934) | Cod sursa (job #977310) | Cod sursa (job #291929) | Cod sursa (job #999324) | Cod sursa (job #1484293)
#include <bits/stdc++.h>
#define last_bit(x) (x&(-x))
using namespace std;
const int Nmax = 100010;
int n , i , ans;
int a[Nmax] , bst[Nmax] , aib[Nmax];
vector < int > Norm , v;
void aibUpdate(int i , int x)
{
for ( ; i <= n; i += last_bit(i))
aib[i] = max(aib[i] , x);
}
int aibQuery(int i)
{
int ret = 0;
for ( ; i ; i -= last_bit(i))
ret = max(ret , aib[i]);
return ret;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scamx.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] = aibQuery(a[i] - 1) + 1;
aibUpdate(a[i] , bst[i]);
ans = max(ans , bst[i]);
}
for (i = n; i ; --i)
if (bst[i] == ans)
{
v.push_back(a[i]);
ans--;
}
for (printf("%d\n", v.size()); v.size(); v.pop_back())
printf("%d ", Norm[v.back()]);
return 0;
}