Pagini recente » Cod sursa (job #1226690) | Cod sursa (job #164155) | Cod sursa (job #1010622) | Cod sursa (job #594126) | Cod sursa (job #2577396)
#include <stdio.h>
#include <map>
#include <unordered_map>
#include <vector>
#include <cstring>
#include <algorithm>
#define BUF_SIZE 1000000
#define SZ(x) ((int)(x.size()))
#define fst first
#define snd second
#define pb push_back
#define nmax 100010
using namespace std;
typedef pair<int, int> pii;
int n, n_size;
int a[nmax], p[nmax], aux[nmax], x[260];
int dp[nmax], pred[nmax];
pii aib[nmax];
unordered_map <int, int> mp;
inline int lsb(int x) { return x & (-x); }
void update(int pos, int val, int ipos)
{
for (int i = pos; i <= n_size; i += lsb(i))
if (val > aib[i].fst) aib[i] = { val, ipos };
}
pii query(int pos)
{
pii ans = { 0, -1 };
for (int i = pos; i >= 1; i -= lsb(i))
if (aib[i].fst > ans.fst) ans = aib[i];
return ans;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d ", &n);
for (int i = 1; i <= n; i++) aib[i] = { 0, -1 };
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]); p[i] = a[i];
}
sort(p + 1, p + n + 1);
n_size = 0;
mp.reserve(2048);
mp.max_load_factor(0.25);
for (int i = 1; i <= n; i++)
if (i == 1 || p[i] != p[i - 1]) mp[p[i]] = ++n_size;
for (int i = 1; i <= n; i++) {
int idx = mp[a[i]];
pii res = query(idx - 1);
dp[i] = res.fst + 1;
pred[i] = res.snd;
update(idx, dp[i], i);
}
int idx = 0;
int best = 0;
vector <int> ans;
for (int i = 1; i <= n; i++)
if (dp[i] > best) { best = dp[i]; idx = i; }
while (idx != -1) { ans.pb(a[idx]); idx = pred[idx]; }
printf("%d\n", best);
for (int i = SZ(ans) - 1; i >= 0; i--) printf("%d ", ans[i]);
return 0;
}